commit:     12b7e98443115d5b6de4d34d90afc490d3a4fecf
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Wed Feb 11 14:35:42 2015 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Wed Feb 11 14:35:42 2015 +0000
URL:        
http://sources.gentoo.org/gitweb/?p=proj/linux-patches.git;a=commit;h=12b7e984

Linux patch 3.18.7

---
 0000_README             |    4 +
 1006_linux-3.18.7.patch | 1358 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1362 insertions(+)

diff --git a/0000_README b/0000_README
index 626b2f5..d897d2e 100644
--- a/0000_README
+++ b/0000_README
@@ -67,6 +67,10 @@ Patch:  1005_linux-3.18.6.patch
 From:   http://www.kernel.org
 Desc:   Linux 3.18.6
 
+Patch:  1006_linux-3.18.7.patch
+From:   http://www.kernel.org
+Desc:   Linux 3.18.7
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1006_linux-3.18.7.patch b/1006_linux-3.18.7.patch
new file mode 100644
index 0000000..d5ed161
--- /dev/null
+++ b/1006_linux-3.18.7.patch
@@ -0,0 +1,1358 @@
+diff --git a/Makefile b/Makefile
+index d2bff2d5ae25..0efae2279fbe 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 3
+ PATCHLEVEL = 18
+-SUBLEVEL = 6
++SUBLEVEL = 7
+ EXTRAVERSION =
+ NAME = Diseased Newt
+ 
+diff --git a/arch/arm/boot/dts/exynos4.dtsi b/arch/arm/boot/dts/exynos4.dtsi
+index e0278ecbc816..98960b7bc518 100644
+--- a/arch/arm/boot/dts/exynos4.dtsi
++++ b/arch/arm/boot/dts/exynos4.dtsi
+@@ -368,7 +368,7 @@
+       };
+ 
+       i2s1: i2s@13960000 {
+-              compatible = "samsung,s5pv210-i2s";
++              compatible = "samsung,s3c6410-i2s";
+               reg = <0x13960000 0x100>;
+               clocks = <&clock CLK_I2S1>;
+               clock-names = "iis";
+@@ -378,7 +378,7 @@
+       };
+ 
+       i2s2: i2s@13970000 {
+-              compatible = "samsung,s5pv210-i2s";
++              compatible = "samsung,s3c6410-i2s";
+               reg = <0x13970000 0x100>;
+               clocks = <&clock CLK_I2S2>;
+               clock-names = "iis";
+diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c
+index 6eb97b3a7481..4370933f16cd 100644
+--- a/arch/arm/mm/context.c
++++ b/arch/arm/mm/context.c
+@@ -144,21 +144,17 @@ static void flush_context(unsigned int cpu)
+       /* Update the list of reserved ASIDs and the ASID bitmap. */
+       bitmap_clear(asid_map, 0, NUM_USER_ASIDS);
+       for_each_possible_cpu(i) {
+-              if (i == cpu) {
+-                      asid = 0;
+-              } else {
+-                      asid = atomic64_xchg(&per_cpu(active_asids, i), 0);
+-                      /*
+-                       * If this CPU has already been through a
+-                       * rollover, but hasn't run another task in
+-                       * the meantime, we must preserve its reserved
+-                       * ASID, as this is the only trace we have of
+-                       * the process it is still running.
+-                       */
+-                      if (asid == 0)
+-                              asid = per_cpu(reserved_asids, i);
+-                      __set_bit(asid & ~ASID_MASK, asid_map);
+-              }
++              asid = atomic64_xchg(&per_cpu(active_asids, i), 0);
++              /*
++               * If this CPU has already been through a
++               * rollover, but hasn't run another task in
++               * the meantime, we must preserve its reserved
++               * ASID, as this is the only trace we have of
++               * the process it is still running.
++               */
++              if (asid == 0)
++                      asid = per_cpu(reserved_asids, i);
++              __set_bit(asid & ~ASID_MASK, asid_map);
+               per_cpu(reserved_asids, i) = asid;
+       }
+ 
+diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
+index 64c4f0800ee3..38eead12f35b 100644
+--- a/arch/arm64/kernel/setup.c
++++ b/arch/arm64/kernel/setup.c
+@@ -43,6 +43,7 @@
+ #include <linux/of_fdt.h>
+ #include <linux/of_platform.h>
+ #include <linux/efi.h>
++#include <linux/personality.h>
+ 
+ #include <asm/fixmap.h>
+ #include <asm/cpu.h>
+@@ -79,7 +80,6 @@ unsigned int compat_elf_hwcap2 __read_mostly;
+ #endif
+ 
+ static const char *cpu_name;
+-static const char *machine_name;
+ phys_addr_t __fdt_pointer __initdata;
+ 
+ /*
+@@ -311,8 +311,6 @@ static void __init setup_machine_fdt(phys_addr_t dt_phys)
+               while (true)
+                       cpu_relax();
+       }
+-
+-      machine_name = of_flat_dt_get_machine_name();
+ }
+ 
+ /*
+@@ -449,14 +447,50 @@ static const char *hwcap_str[] = {
+       NULL
+ };
+ 
++#ifdef CONFIG_COMPAT
++static const char *compat_hwcap_str[] = {
++      "swp",
++      "half",
++      "thumb",
++      "26bit",
++      "fastmult",
++      "fpa",
++      "vfp",
++      "edsp",
++      "java",
++      "iwmmxt",
++      "crunch",
++      "thumbee",
++      "neon",
++      "vfpv3",
++      "vfpv3d16",
++      "tls",
++      "vfpv4",
++      "idiva",
++      "idivt",
++      "vfpd32",
++      "lpae",
++      "evtstrm"
++};
++
++static const char *compat_hwcap2_str[] = {
++      "aes",
++      "pmull",
++      "sha1",
++      "sha2",
++      "crc32",
++      NULL
++};
++#endif /* CONFIG_COMPAT */
++
+ static int c_show(struct seq_file *m, void *v)
+ {
+-      int i;
+-
+-      seq_printf(m, "Processor\t: %s rev %d (%s)\n",
+-                 cpu_name, read_cpuid_id() & 15, ELF_PLATFORM);
++      int i, j;
+ 
+       for_each_online_cpu(i) {
++              struct cpuinfo_arm64 *cpuinfo = &per_cpu(cpu_data, i);
++              u32 midr = cpuinfo->reg_midr;
++
+               /*
+                * glibc reads /proc/cpuinfo to determine the number of
+                * online processors, looking for lines beginning with
+@@ -465,24 +499,38 @@ static int c_show(struct seq_file *m, void *v)
+ #ifdef CONFIG_SMP
+               seq_printf(m, "processor\t: %d\n", i);
+ #endif
+-      }
+-
+-      /* dump out the processor features */
+-      seq_puts(m, "Features\t: ");
+-
+-      for (i = 0; hwcap_str[i]; i++)
+-              if (elf_hwcap & (1 << i))
+-                      seq_printf(m, "%s ", hwcap_str[i]);
+-
+-      seq_printf(m, "\nCPU implementer\t: 0x%02x\n", read_cpuid_id() >> 24);
+-      seq_printf(m, "CPU architecture: AArch64\n");
+-      seq_printf(m, "CPU variant\t: 0x%x\n", (read_cpuid_id() >> 20) & 15);
+-      seq_printf(m, "CPU part\t: 0x%03x\n", (read_cpuid_id() >> 4) & 0xfff);
+-      seq_printf(m, "CPU revision\t: %d\n", read_cpuid_id() & 15);
+ 
+-      seq_puts(m, "\n");
+-
+-      seq_printf(m, "Hardware\t: %s\n", machine_name);
++              /*
++               * Dump out the common processor features in a single line.
++               * Userspace should read the hwcaps with getauxval(AT_HWCAP)
++               * rather than attempting to parse this, but there's a body of
++               * software which does already (at least for 32-bit).
++               */
++              seq_puts(m, "Features\t:");
++              if (personality(current->personality) == PER_LINUX32) {
++#ifdef CONFIG_COMPAT
++                      for (j = 0; compat_hwcap_str[j]; j++)
++                              if (compat_elf_hwcap & (1 << j))
++                                      seq_printf(m, " %s", 
compat_hwcap_str[j]);
++
++                      for (j = 0; compat_hwcap2_str[j]; j++)
++                              if (compat_elf_hwcap2 & (1 << j))
++                                      seq_printf(m, " %s", 
compat_hwcap2_str[j]);
++#endif /* CONFIG_COMPAT */
++              } else {
++                      for (j = 0; hwcap_str[j]; j++)
++                              if (elf_hwcap & (1 << j))
++                                      seq_printf(m, " %s", hwcap_str[j]);
++              }
++              seq_puts(m, "\n");
++
++              seq_printf(m, "CPU implementer\t: 0x%02x\n",
++                         MIDR_IMPLEMENTOR(midr));
++              seq_printf(m, "CPU architecture: 8\n");
++              seq_printf(m, "CPU variant\t: 0x%x\n", MIDR_VARIANT(midr));
++              seq_printf(m, "CPU part\t: 0x%03x\n", MIDR_PARTNUM(midr));
++              seq_printf(m, "CPU revision\t: %d\n\n", MIDR_REVISION(midr));
++      }
+ 
+       return 0;
+ }
+diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c
+index ecd903dd1c45..8b1eeffa12ed 100644
+--- a/arch/mips/cavium-octeon/smp.c
++++ b/arch/mips/cavium-octeon/smp.c
+@@ -240,9 +240,7 @@ static int octeon_cpu_disable(void)
+ 
+       set_cpu_online(cpu, false);
+       cpu_clear(cpu, cpu_callin_map);
+-      local_irq_disable();
+       octeon_fixup_irqs();
+-      local_irq_enable();
+ 
+       flush_cache_all();
+       local_flush_tlb_all();
+diff --git a/arch/mips/include/asm/mipsregs.h 
b/arch/mips/include/asm/mipsregs.h
+index 22a135ac91de..f38ca68285ea 100644
+--- a/arch/mips/include/asm/mipsregs.h
++++ b/arch/mips/include/asm/mipsregs.h
+@@ -1343,12 +1343,27 @@ do {                                                   
                \
+       __res;                                                          \
+ })
+ 
++#define _write_32bit_cp1_register(dest, val, gas_hardfloat)           \
++do {                                                                  \
++      __asm__ __volatile__(                                           \
++      "       .set    push                                    \n"     \
++      "       .set    reorder                                 \n"     \
++      "       "STR(gas_hardfloat)"                            \n"     \
++      "       ctc1    %0,"STR(dest)"                          \n"     \
++      "       .set    pop                                     \n"     \
++      : : "r" (val));                                                 \
++} while (0)
++
+ #ifdef GAS_HAS_SET_HARDFLOAT
+ #define read_32bit_cp1_register(source)                                       
\
+       _read_32bit_cp1_register(source, .set hardfloat)
++#define write_32bit_cp1_register(dest, val)                           \
++      _write_32bit_cp1_register(dest, val, .set hardfloat)
+ #else
+ #define read_32bit_cp1_register(source)                                       
\
+       _read_32bit_cp1_register(source, )
++#define write_32bit_cp1_register(dest, val)                           \
++      _write_32bit_cp1_register(dest, val, )
+ #endif
+ 
+ #ifdef HAVE_AS_DSP
+diff --git a/arch/mips/kernel/irq_cpu.c b/arch/mips/kernel/irq_cpu.c
+index e498f2b3646a..f5598e25e906 100644
+--- a/arch/mips/kernel/irq_cpu.c
++++ b/arch/mips/kernel/irq_cpu.c
+@@ -56,6 +56,8 @@ static struct irq_chip mips_cpu_irq_controller = {
+       .irq_mask_ack   = mask_mips_irq,
+       .irq_unmask     = unmask_mips_irq,
+       .irq_eoi        = unmask_mips_irq,
++      .irq_disable    = mask_mips_irq,
++      .irq_enable     = unmask_mips_irq,
+ };
+ 
+ /*
+@@ -92,6 +94,8 @@ static struct irq_chip mips_mt_cpu_irq_controller = {
+       .irq_mask_ack   = mips_mt_cpu_irq_ack,
+       .irq_unmask     = unmask_mips_irq,
+       .irq_eoi        = unmask_mips_irq,
++      .irq_disable    = mask_mips_irq,
++      .irq_enable     = unmask_mips_irq,
+ };
+ 
+ void __init mips_cpu_irq_init(void)
+diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
+index c94c4e92e17d..1c0d8c50b7e1 100644
+--- a/arch/mips/kernel/smp.c
++++ b/arch/mips/kernel/smp.c
+@@ -123,10 +123,10 @@ asmlinkage void start_secondary(void)
+       unsigned int cpu;
+ 
+       cpu_probe();
+-      cpu_report();
+       per_cpu_trap_init(false);
+       mips_clockevent_init();
+       mp_ops->init_secondary();
++      cpu_report();
+ 
+       /*
+        * XXX parity protection should be folded in here when it's converted
+diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
+index 22b19c275044..d255a2a1837a 100644
+--- a/arch/mips/kernel/traps.c
++++ b/arch/mips/kernel/traps.c
+@@ -1184,7 +1184,8 @@ static int enable_restore_fp_context(int msa)
+ 
+               /* Restore the scalar FP control & status register */
+               if (!was_fpu_owner)
+-                      asm volatile("ctc1 %0, $31" : : 
"r"(current->thread.fpu.fcr31));
++                      write_32bit_cp1_register(CP1_STATUS,
++                                               current->thread.fpu.fcr31);
+       }
+ 
+ out:
+diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c
+index c3917e251f59..11688e50e3ee 100644
+--- a/arch/mips/mm/tlb-r4k.c
++++ b/arch/mips/mm/tlb-r4k.c
+@@ -489,6 +489,8 @@ static void r4k_tlb_configure(void)
+ #ifdef CONFIG_64BIT
+               pg |= PG_ELPA;
+ #endif
++              if (cpu_has_rixiex)
++                      pg |= PG_IEC;
+               write_c0_pagegrain(pg);
+       }
+ 
+diff --git a/arch/x86/kernel/cpu/microcode/core.c 
b/arch/x86/kernel/cpu/microcode/core.c
+index 15c29096136b..36a83617eb21 100644
+--- a/arch/x86/kernel/cpu/microcode/core.c
++++ b/arch/x86/kernel/cpu/microcode/core.c
+@@ -552,7 +552,7 @@ static int __init microcode_init(void)
+       int error;
+ 
+       if (paravirt_enabled() || dis_ucode_ldr)
+-              return 0;
++              return -EINVAL;
+ 
+       if (c->x86_vendor == X86_VENDOR_INTEL)
+               microcode_ops = init_intel_microcode();
+diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
+index a8612aafeca1..4d8ee827cb14 100644
+--- a/arch/x86/mm/fault.c
++++ b/arch/x86/mm/fault.c
+@@ -844,11 +844,8 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, 
unsigned long address,
+         unsigned int fault)
+ {
+       struct task_struct *tsk = current;
+-      struct mm_struct *mm = tsk->mm;
+       int code = BUS_ADRERR;
+ 
+-      up_read(&mm->mmap_sem);
+-
+       /* Kernel mode? Handle exceptions or die: */
+       if (!(error_code & PF_USER)) {
+               no_context(regs, error_code, address, SIGBUS, BUS_ADRERR);
+@@ -879,7 +876,6 @@ mm_fault_error(struct pt_regs *regs, unsigned long 
error_code,
+              unsigned long address, unsigned int fault)
+ {
+       if (fatal_signal_pending(current) && !(error_code & PF_USER)) {
+-              up_read(&current->mm->mmap_sem);
+               no_context(regs, error_code, address, 0, 0);
+               return;
+       }
+@@ -887,14 +883,11 @@ mm_fault_error(struct pt_regs *regs, unsigned long 
error_code,
+       if (fault & VM_FAULT_OOM) {
+               /* Kernel mode? Handle exceptions or die: */
+               if (!(error_code & PF_USER)) {
+-                      up_read(&current->mm->mmap_sem);
+                       no_context(regs, error_code, address,
+                                  SIGSEGV, SEGV_MAPERR);
+                       return;
+               }
+ 
+-              up_read(&current->mm->mmap_sem);
+-
+               /*
+                * We ran out of memory, call the OOM killer, and return the
+                * userspace (which will retry the fault, or kill us if we got
+@@ -1249,6 +1242,7 @@ good_area:
+               return;
+ 
+       if (unlikely(fault & VM_FAULT_ERROR)) {
++              up_read(&mm->mmap_sem);
+               mm_fault_error(regs, error_code, address, fault);
+               return;
+       }
+diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
+index 7b20bccf3648..2fb384724ebb 100644
+--- a/arch/x86/pci/common.c
++++ b/arch/x86/pci/common.c
+@@ -448,6 +448,22 @@ static const struct dmi_system_id pciprobe_dmi_table[] 
__initconst = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "ftServer"),
+               },
+       },
++        {
++                .callback = set_scan_all,
++                .ident = "Stratus/NEC ftServer",
++                .matches = {
++                        DMI_MATCH(DMI_SYS_VENDOR, "NEC"),
++                        DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R32"),
++                },
++        },
++        {
++                .callback = set_scan_all,
++                .ident = "Stratus/NEC ftServer",
++                .matches = {
++                        DMI_MATCH(DMI_SYS_VENDOR, "NEC"),
++                        DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R31"),
++                },
++        },
+       {}
+ };
+ 
+diff --git a/drivers/gpio/gpio-mcp23s08.c b/drivers/gpio/gpio-mcp23s08.c
+index 8488e2fd307c..36bc42942e89 100644
+--- a/drivers/gpio/gpio-mcp23s08.c
++++ b/drivers/gpio/gpio-mcp23s08.c
+@@ -785,9 +785,11 @@ static int mcp230xx_probe(struct i2c_client *client,
+               client->irq = irq_of_parse_and_map(client->dev.of_node, 0);
+       } else {
+               pdata = dev_get_platdata(&client->dev);
+-              if (!pdata || !gpio_is_valid(pdata->base)) {
+-                      dev_dbg(&client->dev, "invalid platform data\n");
+-                      return -EINVAL;
++              if (!pdata) {
++                      pdata = devm_kzalloc(&client->dev,
++                                      sizeof(struct mcp23s08_platform_data),
++                                      GFP_KERNEL);
++                      pdata->base = -1;
+               }
+       }
+ 
+@@ -908,10 +910,11 @@ static int mcp23s08_probe(struct spi_device *spi)
+       } else {
+               type = spi_get_device_id(spi)->driver_data;
+               pdata = dev_get_platdata(&spi->dev);
+-              if (!pdata || !gpio_is_valid(pdata->base)) {
+-                      dev_dbg(&spi->dev,
+-                                      "invalid or missing platform data\n");
+-                      return -EINVAL;
++              if (!pdata) {
++                      pdata = devm_kzalloc(&spi->dev,
++                                      sizeof(struct mcp23s08_platform_data),
++                                      GFP_KERNEL);
++                      pdata->base = -1;
+               }
+ 
+               for (addr = 0; addr < ARRAY_SIZE(pdata->chip); addr++) {
+diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
+index 0d21396f961d..aed7dd6e9dca 100644
+--- a/drivers/gpio/gpiolib-sysfs.c
++++ b/drivers/gpio/gpiolib-sysfs.c
+@@ -630,6 +630,7 @@ int gpiod_export_link(struct device *dev, const char *name,
+               if (tdev != NULL) {
+                       status = sysfs_create_link(&dev->kobj, &tdev->kobj,
+                                               name);
++                      put_device(tdev);
+               } else {
+                       status = -ENODEV;
+               }
+@@ -677,7 +678,7 @@ int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int 
value)
+       }
+ 
+       status = sysfs_set_active_low(desc, dev, value);
+-
++      put_device(dev);
+ unlock:
+       mutex_unlock(&sysfs_lock);
+ 
+diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c 
b/drivers/gpu/drm/radeon/radeon_benchmark.c
+index 9e7f23dd14bd..87d5fb21cb61 100644
+--- a/drivers/gpu/drm/radeon/radeon_benchmark.c
++++ b/drivers/gpu/drm/radeon/radeon_benchmark.c
+@@ -34,7 +34,8 @@
+ 
+ static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size,
+                                   uint64_t saddr, uint64_t daddr,
+-                                  int flag, int n)
++                                  int flag, int n,
++                                  struct reservation_object *resv)
+ {
+       unsigned long start_jiffies;
+       unsigned long end_jiffies;
+@@ -47,12 +48,12 @@ static int radeon_benchmark_do_move(struct radeon_device 
*rdev, unsigned size,
+               case RADEON_BENCHMARK_COPY_DMA:
+                       fence = radeon_copy_dma(rdev, saddr, daddr,
+                                               size / RADEON_GPU_PAGE_SIZE,
+-                                              NULL);
++                                              resv);
+                       break;
+               case RADEON_BENCHMARK_COPY_BLIT:
+                       fence = radeon_copy_blit(rdev, saddr, daddr,
+                                                size / RADEON_GPU_PAGE_SIZE,
+-                                               NULL);
++                                               resv);
+                       break;
+               default:
+                       DRM_ERROR("Unknown copy method\n");
+@@ -120,7 +121,8 @@ static void radeon_benchmark_move(struct radeon_device 
*rdev, unsigned size,
+ 
+       if (rdev->asic->copy.dma) {
+               time = radeon_benchmark_do_move(rdev, size, saddr, daddr,
+-                                              RADEON_BENCHMARK_COPY_DMA, n);
++                                              RADEON_BENCHMARK_COPY_DMA, n,
++                                              dobj->tbo.resv);
+               if (time < 0)
+                       goto out_cleanup;
+               if (time > 0)
+@@ -130,7 +132,8 @@ static void radeon_benchmark_move(struct radeon_device 
*rdev, unsigned size,
+ 
+       if (rdev->asic->copy.blit) {
+               time = radeon_benchmark_do_move(rdev, size, saddr, daddr,
+-                                              RADEON_BENCHMARK_COPY_BLIT, n);
++                                              RADEON_BENCHMARK_COPY_BLIT, n,
++                                              dobj->tbo.resv);
+               if (time < 0)
+                       goto out_cleanup;
+               if (time > 0)
+diff --git a/drivers/gpu/drm/radeon/radeon_display.c 
b/drivers/gpu/drm/radeon/radeon_display.c
+index 00ead8c2758a..2e1e9aa79cea 100644
+--- a/drivers/gpu/drm/radeon/radeon_display.c
++++ b/drivers/gpu/drm/radeon/radeon_display.c
+@@ -959,6 +959,9 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll,
+       if (pll->flags & RADEON_PLL_USE_FRAC_FB_DIV &&
+           pll->flags & RADEON_PLL_USE_REF_DIV)
+               ref_div_max = pll->reference_div;
++      else if (pll->flags & RADEON_PLL_PREFER_MINM_OVER_MAXP)
++              /* fix for problems on RS880 */
++              ref_div_max = min(pll->max_ref_div, 7u);
+       else
+               ref_div_max = pll->max_ref_div;
+ 
+diff --git a/drivers/gpu/drm/radeon/radeon_gem.c 
b/drivers/gpu/drm/radeon/radeon_gem.c
+index c194497aa586..b4abff67c63f 100644
+--- a/drivers/gpu/drm/radeon/radeon_gem.c
++++ b/drivers/gpu/drm/radeon/radeon_gem.c
+@@ -146,7 +146,8 @@ int radeon_gem_object_open(struct drm_gem_object *obj, 
struct drm_file *file_pri
+       struct radeon_bo_va *bo_va;
+       int r;
+ 
+-      if (rdev->family < CHIP_CAYMAN) {
++      if ((rdev->family < CHIP_CAYMAN) ||
++          (!rdev->accel_working)) {
+               return 0;
+       }
+ 
+@@ -176,7 +177,8 @@ void radeon_gem_object_close(struct drm_gem_object *obj,
+       struct radeon_bo_va *bo_va;
+       int r;
+ 
+-      if (rdev->family < CHIP_CAYMAN) {
++      if ((rdev->family < CHIP_CAYMAN) ||
++          (!rdev->accel_working)) {
+               return;
+       }
+ 
+diff --git a/drivers/gpu/drm/radeon/radeon_kms.c 
b/drivers/gpu/drm/radeon/radeon_kms.c
+index 03586763ee86..8ec652722e4f 100644
+--- a/drivers/gpu/drm/radeon/radeon_kms.c
++++ b/drivers/gpu/drm/radeon/radeon_kms.c
+@@ -598,14 +598,14 @@ int radeon_driver_open_kms(struct drm_device *dev, 
struct drm_file *file_priv)
+                       return -ENOMEM;
+               }
+ 
+-              vm = &fpriv->vm;
+-              r = radeon_vm_init(rdev, vm);
+-              if (r) {
+-                      kfree(fpriv);
+-                      return r;
+-              }
+-
+               if (rdev->accel_working) {
++                      vm = &fpriv->vm;
++                      r = radeon_vm_init(rdev, vm);
++                      if (r) {
++                              kfree(fpriv);
++                              return r;
++                      }
++
+                       r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false);
+                       if (r) {
+                               radeon_vm_fini(rdev, vm);
+@@ -663,9 +663,9 @@ void radeon_driver_postclose_kms(struct drm_device *dev,
+                                       radeon_vm_bo_rmv(rdev, vm->ib_bo_va);
+                               radeon_bo_unreserve(rdev->ring_tmp_bo.bo);
+                       }
++                      radeon_vm_fini(rdev, vm);
+               }
+ 
+-              radeon_vm_fini(rdev, vm);
+               kfree(fpriv);
+               file_priv->driver_priv = NULL;
+       }
+diff --git a/drivers/gpu/drm/radeon/radeon_test.c 
b/drivers/gpu/drm/radeon/radeon_test.c
+index 07b506b41008..791818165c76 100644
+--- a/drivers/gpu/drm/radeon/radeon_test.c
++++ b/drivers/gpu/drm/radeon/radeon_test.c
+@@ -119,11 +119,11 @@ static void radeon_do_test_moves(struct radeon_device 
*rdev, int flag)
+               if (ring == R600_RING_TYPE_DMA_INDEX)
+                       fence = radeon_copy_dma(rdev, gtt_addr, vram_addr,
+                                               size / RADEON_GPU_PAGE_SIZE,
+-                                              NULL);
++                                              vram_obj->tbo.resv);
+               else
+                       fence = radeon_copy_blit(rdev, gtt_addr, vram_addr,
+                                                size / RADEON_GPU_PAGE_SIZE,
+-                                               NULL);
++                                               vram_obj->tbo.resv);
+               if (IS_ERR(fence)) {
+                       DRM_ERROR("Failed GTT->VRAM copy %d\n", i);
+                       r = PTR_ERR(fence);
+@@ -170,11 +170,11 @@ static void radeon_do_test_moves(struct radeon_device 
*rdev, int flag)
+               if (ring == R600_RING_TYPE_DMA_INDEX)
+                       fence = radeon_copy_dma(rdev, vram_addr, gtt_addr,
+                                               size / RADEON_GPU_PAGE_SIZE,
+-                                              NULL);
++                                              vram_obj->tbo.resv);
+               else
+                       fence = radeon_copy_blit(rdev, vram_addr, gtt_addr,
+                                                size / RADEON_GPU_PAGE_SIZE,
+-                                               NULL);
++                                               vram_obj->tbo.resv);
+               if (IS_ERR(fence)) {
+                       DRM_ERROR("Failed VRAM->GTT copy %d\n", i);
+                       r = PTR_ERR(fence);
+diff --git a/drivers/gpu/drm/radeon/radeon_vm.c 
b/drivers/gpu/drm/radeon/radeon_vm.c
+index dfde266529e2..afbdf9e685d1 100644
+--- a/drivers/gpu/drm/radeon/radeon_vm.c
++++ b/drivers/gpu/drm/radeon/radeon_vm.c
+@@ -753,9 +753,11 @@ static void radeon_vm_frag_ptes(struct radeon_device 
*rdev,
+        */
+ 
+       /* NI is optimized for 256KB fragments, SI and newer for 64KB */
+-      uint64_t frag_flags = rdev->family == CHIP_CAYMAN ?
++      uint64_t frag_flags = ((rdev->family == CHIP_CAYMAN) ||
++                             (rdev->family == CHIP_ARUBA)) ?
+                       R600_PTE_FRAG_256KB : R600_PTE_FRAG_64KB;
+-      uint64_t frag_align = rdev->family == CHIP_CAYMAN ? 0x200 : 0x80;
++      uint64_t frag_align = ((rdev->family == CHIP_CAYMAN) ||
++                             (rdev->family == CHIP_ARUBA)) ? 0x200 : 0x80;
+ 
+       uint64_t frag_start = ALIGN(pe_start, frag_align);
+       uint64_t frag_end = pe_end & ~(frag_align - 1);
+diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
+index c1b0d52bfcb0..b98765f6f77f 100644
+--- a/drivers/md/raid5.c
++++ b/drivers/md/raid5.c
+@@ -3195,6 +3195,11 @@ static void handle_stripe_dirtying(struct r5conf *conf,
+                                         (unsigned long long)sh->sector,
+                                         rcw, qread, test_bit(STRIPE_DELAYED, 
&sh->state));
+       }
++
++      if (rcw > disks && rmw > disks &&
++          !test_bit(STRIPE_PREREAD_ACTIVE, &sh->state))
++              set_bit(STRIPE_DELAYED, &sh->state);
++
+       /* now if nothing is locked, and if we have enough data,
+        * we can start a write request
+        */
+diff --git a/drivers/pci/host/pcie-designware.c 
b/drivers/pci/host/pcie-designware.c
+index dfed00aa3ac0..f0fcbceee209 100644
+--- a/drivers/pci/host/pcie-designware.c
++++ b/drivers/pci/host/pcie-designware.c
+@@ -283,6 +283,9 @@ static int dw_msi_setup_irq(struct msi_chip *chip, struct 
pci_dev *pdev,
+       struct msi_msg msg;
+       struct pcie_port *pp = sys_to_pcie(pdev->bus->sysdata);
+ 
++      if (desc->msi_attrib.is_msix)
++              return -EINVAL;
++
+       irq = assign_irq(1, desc, &pos);
+       if (irq < 0)
+               return irq;
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index b72e2cdfd59a..04ea682ab2aa 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -324,18 +324,52 @@ static void quirk_s3_64M(struct pci_dev *dev)
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3,    PCI_DEVICE_ID_S3_868,           
quirk_s3_64M);
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3,    PCI_DEVICE_ID_S3_968,           
quirk_s3_64M);
+ 
++static void quirk_io(struct pci_dev *dev, int pos, unsigned size,
++                   const char *name)
++{
++      u32 region;
++      struct pci_bus_region bus_region;
++      struct resource *res = dev->resource + pos;
++
++      pci_read_config_dword(dev, PCI_BASE_ADDRESS_0 + (pos << 2), &region);
++
++      if (!region)
++              return;
++
++      res->name = pci_name(dev);
++      res->flags = region & ~PCI_BASE_ADDRESS_IO_MASK;
++      res->flags |=
++              (IORESOURCE_IO | IORESOURCE_PCI_FIXED | IORESOURCE_SIZEALIGN);
++      region &= ~(size - 1);
++
++      /* Convert from PCI bus to resource space */
++      bus_region.start = region;
++      bus_region.end = region + size - 1;
++      pcibios_bus_to_resource(dev->bus, res, &bus_region);
++
++      dev_info(&dev->dev, FW_BUG "%s quirk: reg 0x%x: %pR\n",
++               name, PCI_BASE_ADDRESS_0 + (pos << 2), res);
++}
++
+ /*
+  * Some CS5536 BIOSes (for example, the Soekris NET5501 board w/ comBIOS
+  * ver. 1.33  20070103) don't set the correct ISA PCI region header info.
+  * BAR0 should be 8 bytes; instead, it may be set to something like 8k
+  * (which conflicts w/ BAR1's memory range).
++ *
++ * CS553x's ISA PCI BARs may also be read-only (ref:
++ * https://bugzilla.kernel.org/show_bug.cgi?id=85991 - Comment #4 forward).
+  */
+ static void quirk_cs5536_vsa(struct pci_dev *dev)
+ {
++      static char *name = "CS5536 ISA bridge";
++
+       if (pci_resource_len(dev, 0) != 8) {
+-              struct resource *res = &dev->resource[0];
+-              res->end = res->start + 8 - 1;
+-              dev_info(&dev->dev, "CS5536 ISA bridge bug detected (incorrect 
header); workaround applied\n");
++              quirk_io(dev, 0,   8, name);    /* SMB */
++              quirk_io(dev, 1, 256, name);    /* GPIO */
++              quirk_io(dev, 2,  64, name);    /* MFGPT */
++              dev_info(&dev->dev, "%s bug detected (incorrect header); 
workaround applied\n",
++                       name);
+       }
+ }
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, 
quirk_cs5536_vsa);
+diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
+index cfba74cd8e8b..dd8c8d690763 100644
+--- a/drivers/scsi/sd.c
++++ b/drivers/scsi/sd.c
+@@ -2818,9 +2818,11 @@ static int sd_revalidate_disk(struct gendisk *disk)
+        */
+       sd_set_flush_flag(sdkp);
+ 
+-      max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue),
+-                              sdkp->max_xfer_blocks);
++      max_xfer = sdkp->max_xfer_blocks;
+       max_xfer <<= ilog2(sdp->sector_size) - 9;
++
++      max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue),
++                              max_xfer);
+       blk_queue_max_hw_sectors(sdkp->disk->queue, max_xfer);
+       set_capacity(disk, sdkp->capacity);
+       sd_config_write_same(sdkp);
+diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
+index 831ceb4a91f6..276a3cf864d7 100644
+--- a/drivers/spi/spi-fsl-dspi.c
++++ b/drivers/spi/spi-fsl-dspi.c
+@@ -342,8 +342,7 @@ static int dspi_setup_transfer(struct spi_device *spi, 
struct spi_transfer *t)
+       /* Only alloc on first setup */
+       chip = spi_get_ctldata(spi);
+       if (chip == NULL) {
+-              chip = devm_kzalloc(&spi->dev, sizeof(struct chip_data),
+-                                  GFP_KERNEL);
++              chip = kzalloc(sizeof(struct chip_data), GFP_KERNEL);
+               if (!chip)
+                       return -ENOMEM;
+       }
+@@ -382,6 +381,16 @@ static int dspi_setup(struct spi_device *spi)
+       return dspi_setup_transfer(spi, NULL);
+ }
+ 
++static void dspi_cleanup(struct spi_device *spi)
++{
++      struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi);
++
++      dev_dbg(&spi->dev, "spi_device %u.%u cleanup\n",
++                      spi->master->bus_num, spi->chip_select);
++
++      kfree(chip);
++}
++
+ static irqreturn_t dspi_interrupt(int irq, void *dev_id)
+ {
+       struct fsl_dspi *dspi = (struct fsl_dspi *)dev_id;
+@@ -467,6 +476,7 @@ static int dspi_probe(struct platform_device *pdev)
+       dspi->bitbang.master->setup = dspi_setup;
+       dspi->bitbang.master->dev.of_node = pdev->dev.of_node;
+ 
++      master->cleanup = dspi_cleanup;
+       master->mode_bits = SPI_CPOL | SPI_CPHA;
+       master->bits_per_word_mask = SPI_BPW_MASK(4) | SPI_BPW_MASK(8) |
+                                       SPI_BPW_MASK(16);
+diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
+index 3637847b5370..82269a86fd7a 100644
+--- a/drivers/spi/spi-imx.c
++++ b/drivers/spi/spi-imx.c
+@@ -823,6 +823,10 @@ static int spi_imx_sdma_init(struct device *dev, struct 
spi_imx_data *spi_imx,
+       struct dma_slave_config slave_config = {};
+       int ret;
+ 
++      /* use pio mode for i.mx6dl chip TKT238285 */
++      if (of_machine_is_compatible("fsl,imx6dl"))
++              return 0;
++
+       /* Prepare for TX DMA: */
+       master->dma_tx = dma_request_slave_channel(dev, "tx");
+       if (!master->dma_tx) {
+diff --git a/fs/cifs/file.c b/fs/cifs/file.c
+index 3e4d00a06c44..9a7b6947874a 100644
+--- a/fs/cifs/file.c
++++ b/fs/cifs/file.c
+@@ -366,6 +366,7 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file)
+       struct cifsLockInfo *li, *tmp;
+       struct cifs_fid fid;
+       struct cifs_pending_open open;
++      bool oplock_break_cancelled;
+ 
+       spin_lock(&cifs_file_list_lock);
+       if (--cifs_file->count > 0) {
+@@ -397,7 +398,7 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file)
+       }
+       spin_unlock(&cifs_file_list_lock);
+ 
+-      cancel_work_sync(&cifs_file->oplock_break);
++      oplock_break_cancelled = cancel_work_sync(&cifs_file->oplock_break);
+ 
+       if (!tcon->need_reconnect && !cifs_file->invalidHandle) {
+               struct TCP_Server_Info *server = tcon->ses->server;
+@@ -409,6 +410,9 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file)
+               _free_xid(xid);
+       }
+ 
++      if (oplock_break_cancelled)
++              cifs_done_oplock_break(cifsi);
++
+       cifs_del_pending_open(&open);
+ 
+       /*
+diff --git a/fs/nilfs2/nilfs.h b/fs/nilfs2/nilfs.h
+index 91093cd74f0d..385704027575 100644
+--- a/fs/nilfs2/nilfs.h
++++ b/fs/nilfs2/nilfs.h
+@@ -141,7 +141,6 @@ enum {
+  * @ti_save: Backup of journal_info field of task_struct
+  * @ti_flags: Flags
+  * @ti_count: Nest level
+- * @ti_garbage:       List of inode to be put when releasing semaphore
+  */
+ struct nilfs_transaction_info {
+       u32                     ti_magic;
+@@ -150,7 +149,6 @@ struct nilfs_transaction_info {
+                                  one of other filesystems has a bug. */
+       unsigned short          ti_flags;
+       unsigned short          ti_count;
+-      struct list_head        ti_garbage;
+ };
+ 
+ /* ti_magic */
+diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
+index 7ef18fc656c2..469086b9f99b 100644
+--- a/fs/nilfs2/segment.c
++++ b/fs/nilfs2/segment.c
+@@ -305,7 +305,6 @@ static void nilfs_transaction_lock(struct super_block *sb,
+       ti->ti_count = 0;
+       ti->ti_save = cur_ti;
+       ti->ti_magic = NILFS_TI_MAGIC;
+-      INIT_LIST_HEAD(&ti->ti_garbage);
+       current->journal_info = ti;
+ 
+       for (;;) {
+@@ -332,8 +331,6 @@ static void nilfs_transaction_unlock(struct super_block 
*sb)
+ 
+       up_write(&nilfs->ns_segctor_sem);
+       current->journal_info = ti->ti_save;
+-      if (!list_empty(&ti->ti_garbage))
+-              nilfs_dispose_list(nilfs, &ti->ti_garbage, 0);
+ }
+ 
+ static void *nilfs_segctor_map_segsum_entry(struct nilfs_sc_info *sci,
+@@ -746,6 +743,15 @@ static void nilfs_dispose_list(struct the_nilfs *nilfs,
+       }
+ }
+ 
++static void nilfs_iput_work_func(struct work_struct *work)
++{
++      struct nilfs_sc_info *sci = container_of(work, struct nilfs_sc_info,
++                                               sc_iput_work);
++      struct the_nilfs *nilfs = sci->sc_super->s_fs_info;
++
++      nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 0);
++}
++
+ static int nilfs_test_metadata_dirty(struct the_nilfs *nilfs,
+                                    struct nilfs_root *root)
+ {
+@@ -1900,8 +1906,8 @@ static int nilfs_segctor_collect_dirty_files(struct 
nilfs_sc_info *sci,
+ static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci,
+                                            struct the_nilfs *nilfs)
+ {
+-      struct nilfs_transaction_info *ti = current->journal_info;
+       struct nilfs_inode_info *ii, *n;
++      int defer_iput = false;
+ 
+       spin_lock(&nilfs->ns_inode_lock);
+       list_for_each_entry_safe(ii, n, &sci->sc_dirty_files, i_dirty) {
+@@ -1912,9 +1918,24 @@ static void nilfs_segctor_drop_written_files(struct 
nilfs_sc_info *sci,
+               clear_bit(NILFS_I_BUSY, &ii->i_state);
+               brelse(ii->i_bh);
+               ii->i_bh = NULL;
+-              list_move_tail(&ii->i_dirty, &ti->ti_garbage);
++              list_del_init(&ii->i_dirty);
++              if (!ii->vfs_inode.i_nlink) {
++                      /*
++                       * Defer calling iput() to avoid a deadlock
++                       * over I_SYNC flag for inodes with i_nlink == 0
++                       */
++                      list_add_tail(&ii->i_dirty, &sci->sc_iput_queue);
++                      defer_iput = true;
++              } else {
++                      spin_unlock(&nilfs->ns_inode_lock);
++                      iput(&ii->vfs_inode);
++                      spin_lock(&nilfs->ns_inode_lock);
++              }
+       }
+       spin_unlock(&nilfs->ns_inode_lock);
++
++      if (defer_iput)
++              schedule_work(&sci->sc_iput_work);
+ }
+ 
+ /*
+@@ -2583,6 +2604,8 @@ static struct nilfs_sc_info *nilfs_segctor_new(struct 
super_block *sb,
+       INIT_LIST_HEAD(&sci->sc_segbufs);
+       INIT_LIST_HEAD(&sci->sc_write_logs);
+       INIT_LIST_HEAD(&sci->sc_gc_inodes);
++      INIT_LIST_HEAD(&sci->sc_iput_queue);
++      INIT_WORK(&sci->sc_iput_work, nilfs_iput_work_func);
+       init_timer(&sci->sc_timer);
+ 
+       sci->sc_interval = HZ * NILFS_SC_DEFAULT_TIMEOUT;
+@@ -2609,6 +2632,8 @@ static void nilfs_segctor_write_out(struct nilfs_sc_info 
*sci)
+               ret = nilfs_segctor_construct(sci, SC_LSEG_SR);
+               nilfs_transaction_unlock(sci->sc_super);
+ 
++              flush_work(&sci->sc_iput_work);
++
+       } while (ret && retrycount-- > 0);
+ }
+ 
+@@ -2633,6 +2658,9 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info 
*sci)
+               || sci->sc_seq_request != sci->sc_seq_done);
+       spin_unlock(&sci->sc_state_lock);
+ 
++      if (flush_work(&sci->sc_iput_work))
++              flag = true;
++
+       if (flag || !nilfs_segctor_confirm(sci))
+               nilfs_segctor_write_out(sci);
+ 
+@@ -2642,6 +2670,12 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info 
*sci)
+               nilfs_dispose_list(nilfs, &sci->sc_dirty_files, 1);
+       }
+ 
++      if (!list_empty(&sci->sc_iput_queue)) {
++              nilfs_warning(sci->sc_super, __func__,
++                            "iput queue is not empty\n");
++              nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 1);
++      }
++
+       WARN_ON(!list_empty(&sci->sc_segbufs));
+       WARN_ON(!list_empty(&sci->sc_write_logs));
+ 
+diff --git a/fs/nilfs2/segment.h b/fs/nilfs2/segment.h
+index 38a1d0013314..a48d6de1e02c 100644
+--- a/fs/nilfs2/segment.h
++++ b/fs/nilfs2/segment.h
+@@ -26,6 +26,7 @@
+ #include <linux/types.h>
+ #include <linux/fs.h>
+ #include <linux/buffer_head.h>
++#include <linux/workqueue.h>
+ #include <linux/nilfs2_fs.h>
+ #include "nilfs.h"
+ 
+@@ -92,6 +93,8 @@ struct nilfs_segsum_pointer {
+  * @sc_nblk_inc: Block count of current generation
+  * @sc_dirty_files: List of files to be written
+  * @sc_gc_inodes: List of GC inodes having blocks to be written
++ * @sc_iput_queue: list of inodes for which iput should be done
++ * @sc_iput_work: work struct to defer iput call
+  * @sc_freesegs: array of segment numbers to be freed
+  * @sc_nfreesegs: number of segments on @sc_freesegs
+  * @sc_dsync_inode: inode whose data pages are written for a sync operation
+@@ -135,6 +138,8 @@ struct nilfs_sc_info {
+ 
+       struct list_head        sc_dirty_files;
+       struct list_head        sc_gc_inodes;
++      struct list_head        sc_iput_queue;
++      struct work_struct      sc_iput_work;
+ 
+       __u64                  *sc_freesegs;
+       size_t                  sc_nfreesegs;
+diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
+index e08e21e5f601..c72851328ca9 100644
+--- a/include/linux/tracepoint.h
++++ b/include/linux/tracepoint.h
+@@ -173,7 +173,7 @@ extern void syscall_unregfunc(void);
+                               TP_PROTO(data_proto),                   \
+                               TP_ARGS(data_args),                     \
+                               TP_CONDITION(cond),,);                  \
+-              if (IS_ENABLED(CONFIG_LOCKDEP)) {                       \
++              if (IS_ENABLED(CONFIG_LOCKDEP) && (cond)) {             \
+                       rcu_read_lock_sched_notrace();                  \
+                       rcu_dereference_sched(__tracepoint_##name.funcs);\
+                       rcu_read_unlock_sched_notrace();                \
+diff --git a/include/sound/ak4113.h b/include/sound/ak4113.h
+index 2609048c1d44..3a34f6edc2d1 100644
+--- a/include/sound/ak4113.h
++++ b/include/sound/ak4113.h
+@@ -286,7 +286,7 @@ struct ak4113 {
+       ak4113_write_t *write;
+       ak4113_read_t *read;
+       void *private_data;
+-      unsigned int init:1;
++      atomic_t wq_processing;
+       spinlock_t lock;
+       unsigned char regmap[AK4113_WRITABLE_REGS];
+       struct snd_kcontrol *kctls[AK4113_CONTROLS];
+diff --git a/include/sound/ak4114.h b/include/sound/ak4114.h
+index 52f02a60dba7..069299a88915 100644
+--- a/include/sound/ak4114.h
++++ b/include/sound/ak4114.h
+@@ -168,7 +168,7 @@ struct ak4114 {
+       ak4114_write_t * write;
+       ak4114_read_t * read;
+       void * private_data;
+-      unsigned int init: 1;
++      atomic_t wq_processing;
+       spinlock_t lock;
+       unsigned char regmap[6];
+       unsigned char txcsb[5];
+diff --git a/include/trace/events/tlb.h b/include/trace/events/tlb.h
+index 13391d288107..0e7635765153 100644
+--- a/include/trace/events/tlb.h
++++ b/include/trace/events/tlb.h
+@@ -13,11 +13,13 @@
+       { TLB_LOCAL_SHOOTDOWN,          "local shootdown" },            \
+       { TLB_LOCAL_MM_SHOOTDOWN,       "local mm shootdown" }
+ 
+-TRACE_EVENT(tlb_flush,
++TRACE_EVENT_CONDITION(tlb_flush,
+ 
+       TP_PROTO(int reason, unsigned long pages),
+       TP_ARGS(reason, pages),
+ 
++      TP_CONDITION(cpu_online(smp_processor_id())),
++
+       TP_STRUCT__entry(
+               __field(          int, reason)
+               __field(unsigned long,  pages)
+diff --git a/kernel/smpboot.c b/kernel/smpboot.c
+index eb89e1807408..60d35ac5d3f1 100644
+--- a/kernel/smpboot.c
++++ b/kernel/smpboot.c
+@@ -279,6 +279,7 @@ int smpboot_register_percpu_thread(struct 
smp_hotplug_thread *plug_thread)
+       unsigned int cpu;
+       int ret = 0;
+ 
++      get_online_cpus();
+       mutex_lock(&smpboot_threads_lock);
+       for_each_online_cpu(cpu) {
+               ret = __smpboot_create_thread(plug_thread, cpu);
+@@ -291,6 +292,7 @@ int smpboot_register_percpu_thread(struct 
smp_hotplug_thread *plug_thread)
+       list_add(&plug_thread->list, &hotplug_threads);
+ out:
+       mutex_unlock(&smpboot_threads_lock);
++      put_online_cpus();
+       return ret;
+ }
+ EXPORT_SYMBOL_GPL(smpboot_register_percpu_thread);
+diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
+index 37e50aadd471..d8c724cda37b 100644
+--- a/kernel/time/hrtimer.c
++++ b/kernel/time/hrtimer.c
+@@ -122,7 +122,7 @@ static void hrtimer_get_softirq_time(struct 
hrtimer_cpu_base *base)
+       mono = ktime_get_update_offsets_tick(&off_real, &off_boot, &off_tai);
+       boot = ktime_add(mono, off_boot);
+       xtim = ktime_add(mono, off_real);
+-      tai = ktime_add(xtim, off_tai);
++      tai = ktime_add(mono, off_tai);
+ 
+       base->clock_base[HRTIMER_BASE_REALTIME].softirq_time = xtim;
+       base->clock_base[HRTIMER_BASE_MONOTONIC].softirq_time = mono;
+diff --git a/lib/checksum.c b/lib/checksum.c
+index 129775eb6de6..8b39e86dbab5 100644
+--- a/lib/checksum.c
++++ b/lib/checksum.c
+@@ -181,6 +181,15 @@ csum_partial_copy(const void *src, void *dst, int len, 
__wsum sum)
+ EXPORT_SYMBOL(csum_partial_copy);
+ 
+ #ifndef csum_tcpudp_nofold
++static inline u32 from64to32(u64 x)
++{
++      /* add up 32-bit and 32-bit for 32+c bit */
++      x = (x & 0xffffffff) + (x >> 32);
++      /* add up carry.. */
++      x = (x & 0xffffffff) + (x >> 32);
++      return (u32)x;
++}
++
+ __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
+                       unsigned short len,
+                       unsigned short proto,
+@@ -195,8 +204,7 @@ __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
+ #else
+       s += (proto + len) << 8;
+ #endif
+-      s += (s >> 32);
+-      return (__force __wsum)s;
++      return (__force __wsum)from64to32(s);
+ }
+ EXPORT_SYMBOL(csum_tcpudp_nofold);
+ #endif
+diff --git a/mm/memcontrol.c b/mm/memcontrol.c
+index 4918b6eefae2..d72bdc3ca09b 100644
+--- a/mm/memcontrol.c
++++ b/mm/memcontrol.c
+@@ -6589,7 +6589,7 @@ void mem_cgroup_uncharge_list(struct list_head 
*page_list)
+  * mem_cgroup_migrate - migrate a charge to another page
+  * @oldpage: currently charged page
+  * @newpage: page to transfer the charge to
+- * @lrucare: both pages might be on the LRU already
++ * @lrucare: either or both pages might be on the LRU already
+  *
+  * Migrate the charge from @oldpage to @newpage.
+  *
+diff --git a/mm/pagewalk.c b/mm/pagewalk.c
+index ad83195521f2..b264bda46e1b 100644
+--- a/mm/pagewalk.c
++++ b/mm/pagewalk.c
+@@ -199,7 +199,10 @@ int walk_page_range(unsigned long addr, unsigned long end,
+                        */
+                       if ((vma->vm_start <= addr) &&
+                           (vma->vm_flags & VM_PFNMAP)) {
+-                              next = vma->vm_end;
++                              if (walk->pte_hole)
++                                      err = walk->pte_hole(addr, next, walk);
++                              if (err)
++                                      break;
+                               pgd = pgd_offset(walk->mm, next);
+                               continue;
+                       }
+diff --git a/mm/shmem.c b/mm/shmem.c
+index 185836ba53ef..0b4ba556703a 100644
+--- a/mm/shmem.c
++++ b/mm/shmem.c
+@@ -1013,7 +1013,7 @@ static int shmem_replace_page(struct page **pagep, gfp_t 
gfp,
+                */
+               oldpage = newpage;
+       } else {
+-              mem_cgroup_migrate(oldpage, newpage, false);
++              mem_cgroup_migrate(oldpage, newpage, true);
+               lru_cache_add_anon(newpage);
+               *pagep = newpage;
+       }
+diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c
+index a26cc5d2a9b0..72c9dba84c5d 100644
+--- a/scripts/kconfig/menu.c
++++ b/scripts/kconfig/menu.c
+@@ -548,7 +548,7 @@ static void get_prompt_str(struct gstr *r, struct property 
*prop,
+ {
+       int i, j;
+       struct menu *submenu[8], *menu, *location = NULL;
+-      struct jump_key *jump;
++      struct jump_key *jump = NULL;
+ 
+       str_printf(r, _("Prompt: %s\n"), _(prop->text));
+       menu = prop->menu->parent;
+@@ -586,7 +586,7 @@ static void get_prompt_str(struct gstr *r, struct property 
*prop,
+               str_printf(r, _("  Location:\n"));
+               for (j = 4; --i >= 0; j += 2) {
+                       menu = submenu[i];
+-                      if (head && location && menu == location)
++                      if (jump && menu == location)
+                               jump->offset = strlen(r->s);
+                       str_printf(r, "%*c-> %s", j, ' ',
+                                  _(menu_get_prompt(menu)));
+diff --git a/sound/i2c/other/ak4113.c b/sound/i2c/other/ak4113.c
+index 1a3a6fa27158..c6bba99a90b2 100644
+--- a/sound/i2c/other/ak4113.c
++++ b/sound/i2c/other/ak4113.c
+@@ -56,8 +56,7 @@ static inline unsigned char reg_read(struct ak4113 *ak4113, 
unsigned char reg)
+ 
+ static void snd_ak4113_free(struct ak4113 *chip)
+ {
+-      chip->init = 1; /* don't schedule new work */
+-      mb();
++      atomic_inc(&chip->wq_processing);       /* don't schedule new work */
+       cancel_delayed_work_sync(&chip->work);
+       kfree(chip);
+ }
+@@ -89,6 +88,7 @@ int snd_ak4113_create(struct snd_card *card, ak4113_read_t 
*read,
+       chip->write = write;
+       chip->private_data = private_data;
+       INIT_DELAYED_WORK(&chip->work, ak4113_stats);
++      atomic_set(&chip->wq_processing, 0);
+ 
+       for (reg = 0; reg < AK4113_WRITABLE_REGS ; reg++)
+               chip->regmap[reg] = pgm[reg];
+@@ -139,13 +139,11 @@ static void ak4113_init_regs(struct ak4113 *chip)
+ 
+ void snd_ak4113_reinit(struct ak4113 *chip)
+ {
+-      chip->init = 1;
+-      mb();
+-      flush_delayed_work(&chip->work);
++      if (atomic_inc_return(&chip->wq_processing) == 1)
++              cancel_delayed_work_sync(&chip->work);
+       ak4113_init_regs(chip);
+       /* bring up statistics / event queing */
+-      chip->init = 0;
+-      if (chip->kctls[0])
++      if (atomic_dec_and_test(&chip->wq_processing))
+               schedule_delayed_work(&chip->work, HZ / 10);
+ }
+ EXPORT_SYMBOL_GPL(snd_ak4113_reinit);
+@@ -632,8 +630,9 @@ static void ak4113_stats(struct work_struct *work)
+ {
+       struct ak4113 *chip = container_of(work, struct ak4113, work.work);
+ 
+-      if (!chip->init)
++      if (atomic_inc_return(&chip->wq_processing) == 1)
+               snd_ak4113_check_rate_and_errors(chip, chip->check_flags);
+ 
+-      schedule_delayed_work(&chip->work, HZ / 10);
++      if (atomic_dec_and_test(&chip->wq_processing))
++              schedule_delayed_work(&chip->work, HZ / 10);
+ }
+diff --git a/sound/i2c/other/ak4114.c b/sound/i2c/other/ak4114.c
+index c7f56339415d..b70e6eccbd03 100644
+--- a/sound/i2c/other/ak4114.c
++++ b/sound/i2c/other/ak4114.c
+@@ -66,8 +66,7 @@ static void reg_dump(struct ak4114 *ak4114)
+ 
+ static void snd_ak4114_free(struct ak4114 *chip)
+ {
+-      chip->init = 1; /* don't schedule new work */
+-      mb();
++      atomic_inc(&chip->wq_processing);       /* don't schedule new work */
+       cancel_delayed_work_sync(&chip->work);
+       kfree(chip);
+ }
+@@ -100,6 +99,7 @@ int snd_ak4114_create(struct snd_card *card,
+       chip->write = write;
+       chip->private_data = private_data;
+       INIT_DELAYED_WORK(&chip->work, ak4114_stats);
++      atomic_set(&chip->wq_processing, 0);
+ 
+       for (reg = 0; reg < 6; reg++)
+               chip->regmap[reg] = pgm[reg];
+@@ -152,13 +152,11 @@ static void ak4114_init_regs(struct ak4114 *chip)
+ 
+ void snd_ak4114_reinit(struct ak4114 *chip)
+ {
+-      chip->init = 1;
+-      mb();
+-      flush_delayed_work(&chip->work);
++      if (atomic_inc_return(&chip->wq_processing) == 1)
++              cancel_delayed_work_sync(&chip->work);
+       ak4114_init_regs(chip);
+       /* bring up statistics / event queing */
+-      chip->init = 0;
+-      if (chip->kctls[0])
++      if (atomic_dec_and_test(&chip->wq_processing))
+               schedule_delayed_work(&chip->work, HZ / 10);
+ }
+ 
+@@ -612,10 +610,10 @@ static void ak4114_stats(struct work_struct *work)
+ {
+       struct ak4114 *chip = container_of(work, struct ak4114, work.work);
+ 
+-      if (!chip->init)
++      if (atomic_inc_return(&chip->wq_processing) == 1)
+               snd_ak4114_check_rate_and_errors(chip, chip->check_flags);
+-
+-      schedule_delayed_work(&chip->work, HZ / 10);
++      if (atomic_dec_and_test(&chip->wq_processing))
++              schedule_delayed_work(&chip->work, HZ / 10);
+ }
+ 
+ EXPORT_SYMBOL(snd_ak4114_create);
+diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c
+index f403f399808a..51413e239cc3 100644
+--- a/sound/soc/atmel/atmel_ssc_dai.c
++++ b/sound/soc/atmel/atmel_ssc_dai.c
+@@ -345,7 +345,6 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream 
*substream,
+       struct atmel_pcm_dma_params *dma_params;
+       int dir, channels, bits;
+       u32 tfmr, rfmr, tcmr, rcmr;
+-      int start_event;
+       int ret;
+       int fslen, fslen_ext;
+ 
+@@ -454,19 +453,10 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream 
*substream,
+                * The SSC transmit clock is obtained from the BCLK signal on
+                * on the TK line, and the SSC receive clock is
+                * generated from the transmit clock.
+-               *
+-               *  For single channel data, one sample is transferred
+-               * on the falling edge of the LRC clock.
+-               * For two channel data, one sample is
+-               * transferred on both edges of the LRC clock.
+                */
+-              start_event = ((channels == 1)
+-                              ? SSC_START_FALLING_RF
+-                              : SSC_START_EDGE_RF);
+-
+               rcmr =    SSC_BF(RCMR_PERIOD, 0)
+                       | SSC_BF(RCMR_STTDLY, START_DELAY)
+-                      | SSC_BF(RCMR_START, start_event)
++                      | SSC_BF(RCMR_START, SSC_START_FALLING_RF)
+                       | SSC_BF(RCMR_CKI, SSC_CKI_RISING)
+                       | SSC_BF(RCMR_CKO, SSC_CKO_NONE)
+                       | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ?
+@@ -475,14 +465,14 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream 
*substream,
+               rfmr =    SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
+                       | SSC_BF(RFMR_FSOS, SSC_FSOS_NONE)
+                       | SSC_BF(RFMR_FSLEN, 0)
+-                      | SSC_BF(RFMR_DATNB, 0)
++                      | SSC_BF(RFMR_DATNB, (channels - 1))
+                       | SSC_BIT(RFMR_MSBF)
+                       | SSC_BF(RFMR_LOOP, 0)
+                       | SSC_BF(RFMR_DATLEN, (bits - 1));
+ 
+               tcmr =    SSC_BF(TCMR_PERIOD, 0)
+                       | SSC_BF(TCMR_STTDLY, START_DELAY)
+-                      | SSC_BF(TCMR_START, start_event)
++                      | SSC_BF(TCMR_START, SSC_START_FALLING_RF)
+                       | SSC_BF(TCMR_CKI, SSC_CKI_FALLING)
+                       | SSC_BF(TCMR_CKO, SSC_CKO_NONE)
+                       | SSC_BF(TCMR_CKS, ssc->clk_from_rk_pin ?
+@@ -492,7 +482,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream 
*substream,
+                       | SSC_BF(TFMR_FSDEN, 0)
+                       | SSC_BF(TFMR_FSOS, SSC_FSOS_NONE)
+                       | SSC_BF(TFMR_FSLEN, 0)
+-                      | SSC_BF(TFMR_DATNB, 0)
++                      | SSC_BF(TFMR_DATNB, (channels - 1))
+                       | SSC_BIT(TFMR_MSBF)
+                       | SSC_BF(TFMR_DATDEF, 0)
+                       | SSC_BF(TFMR_DATLEN, (bits - 1));
+diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c
+index dab9b15304af..f1287ff8dd29 100644
+--- a/sound/soc/codecs/sgtl5000.c
++++ b/sound/soc/codecs/sgtl5000.c
+@@ -1452,6 +1452,9 @@ static int sgtl5000_i2c_probe(struct i2c_client *client,
+       if (ret)
+               return ret;
+ 
++      /* Need 8 clocks before I2C accesses */
++      udelay(1);
++
+       /* read chip information */
+       ret = regmap_read(sgtl5000->regmap, SGTL5000_CHIP_ID, &reg);
+       if (ret)

Reply via email to