]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
Merge branch 'linux-3.10.49' into dev-kernel-3.10
authorIshan Mittal <imittal@nvidia.com>
Thu, 30 Oct 2014 05:14:03 +0000 (10:44 +0530)
committerIshan Mittal <imittal@nvidia.com>
Thu, 30 Oct 2014 05:14:03 +0000 (10:44 +0530)
Includes :
    1. linux-3.10.49 merge
    2. Revert arm: usb: cdc: Modifed USB buffer logic for autopm issue
       (6510858f)
    3. Revert arm: usb: cdc: Fix cdc-acm auto pm issues(2a457b4)

Bug 200023519

Change-Id: Id54870079cd19b4e5ca4fcf05fd4c15356157229
Signed-off-by: Ishan Mittal <imittal@nvidia.com>
109 files changed:
1  2 
Makefile
arch/arm/include/asm/io.h
arch/arm/include/asm/outercache.h
arch/arm/include/asm/pgtable-2level.h
arch/arm/include/asm/unistd.h
arch/arm/kernel/perf_event.c
arch/arm/kernel/setup.c
arch/arm/mach-ixp4xx/common.c
arch/arm/mm/Kconfig
arch/arm/mm/ioremap.c
arch/arm/mm/mmu.c
arch/arm/mm/proc-v7-2level.S
arch/arm/mm/proc-v7-3level.S
arch/arm64/include/asm/memory.h
arch/arm64/include/asm/pgtable.h
arch/arm64/kernel/entry.S
arch/arm64/kernel/ptrace.c
arch/metag/include/asm/barrier.h
arch/powerpc/kernel/signal_32.c
arch/s390/Kconfig
arch/sparc/Kconfig
arch/x86/syscalls/syscall_64.tbl
drivers/bluetooth/hci_ldisc.c
drivers/cpufreq/Makefile
drivers/cpufreq/cpufreq_governor.c
drivers/cpufreq/powernow-k6.c
drivers/extcon/extcon-max77693.c
drivers/extcon/extcon-max8997.c
drivers/hid/hid-core.c
drivers/hwmon/Kconfig
drivers/i2c/busses/Kconfig
drivers/i2c/busses/i2c-s3c2410.c
drivers/iio/inkern.c
drivers/iio/magnetometer/ak8975.c
drivers/irqchip/irq-gic.c
drivers/md/dm-crypt.c
drivers/mfd/tps65910.c
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
drivers/net/usb/usbnet.c
drivers/pci/pci.c
drivers/pci/quirks.c
drivers/regulator/core.c
drivers/tty/serial/8250/8250_core.c
drivers/usb/class/cdc-acm.c
drivers/usb/class/cdc-acm.h
drivers/usb/core/hub.c
drivers/usb/gadget/f_fs.c
drivers/usb/gadget/tcm_usb_gadget.c
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.c
fs/exec.c
fs/ext4/extents.c
fs/ext4/mballoc.c
fs/ext4/super.c
fs/fs-writeback.c
fs/inode.c
fs/nfs/inode.c
fs/nfs/nfs4proc.c
fs/proc/base.c
include/linux/interrupt.h
include/linux/irqdesc.h
include/linux/mm.h
include/linux/usb/usbnet.h
include/net/ip6_route.h
include/net/sock.h
include/net/tcp.h
init/Kconfig
kernel/cpu.c
kernel/exit.c
kernel/fork.c
kernel/futex.c
kernel/hrtimer.c
kernel/module.c
kernel/sched/core.c
kernel/sysctl.c
kernel/time/tick-sched.c
kernel/timer.c
kernel/trace/trace.c
kernel/trace/trace.h
kernel/trace/trace_events.c
mm/backing-dev.c
mm/compaction.c
mm/memcontrol.c
mm/memory.c
mm/mempolicy.c
mm/mlock.c
mm/page_alloc.c
mm/vmscan.c
net/bluetooth/hci_conn.c
net/bluetooth/hci_event.c
net/bluetooth/l2cap_sock.c
net/bluetooth/mgmt.c
net/core/sock.c
net/ipv4/route.c
net/ipv4/tcp.c
net/ipv4/tcp_input.c
net/ipv4/tcp_output.c
net/ipv6/addrconf.c
net/ipv6/exthdrs_core.c
net/ipv6/icmp.c
net/ipv6/route.c
net/mac80211/ieee80211_i.h
net/netlink/af_netlink.c
net/socket.c
net/unix/af_unix.c
security/selinux/hooks.c
sound/core/compress_offload.c
sound/pci/hda/hda_intel.c
sound/soc/codecs/cs42l73.c

diff --cc Makefile
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 37f9e6294afb0dda5653324e47e92f61776d6ec2,3a710d7b14cec76f11cb3a2b69748a48096c114c..eae45eebced575100148a9749e3a4e4a8666c171
@@@ -212,12 -161,10 +212,12 @@@ static inline void set_pte_at(struct mm
                              pte_t *ptep, pte_t pte)
  {
        if (pte_valid_user(pte)) {
-               if (pte_exec(pte))
+               if (!pte_special(pte) && pte_exec(pte))
                        __sync_icache_dcache(pte, addr);
 -              if (!pte_dirty(pte))
 -                      pte = pte_wrprotect(pte);
 +              if (pte_dirty(pte) && pte_write(pte))
 +                      pte_val(pte) &= ~PTE_RDONLY;
 +              else
 +                      pte_val(pte) |= PTE_RDONLY;
        }
  
        set_pte(ptep, pte);
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index f7f7106c475809bad35799abb1a637d2d446065e,c4d2f0e4868529a870b372290baf6a5315c4266c..1c70ff05ac0443273baba5c8c08502955c8a9c12
@@@ -326,8 -338,9 +338,10 @@@ static void hci_uart_tty_close(struct t
        if (hdev)
                hci_uart_close(hdev);
  
+       cancel_work_sync(&hu->write_work);
        if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) {
 +              hu->proto->close(hu);
                if (hdev) {
                        if (test_bit(HCI_UART_REGISTERED, &hu->flags))
                                hci_unregister_dev(hdev);
Simple merge
Simple merge
index af23e0b9ec926e8f26cc07dc4c90e5359d404486,b07ca0d3f56ab7934c7256051102e758ea508776..e7e87e6108b4888456abd06857202ba0c1e5ba9e
@@@ -68,10 -135,9 +135,8 @@@ static void powernow_k6_set_cpu_multipl
   *
   *   Tries to change the PowerNow! multiplier
   */
 -static void powernow_k6_set_state(struct cpufreq_policy *policy,
 -              unsigned int best_i)
 +static void powernow_k6_set_state(unsigned int best_i)
  {
-       unsigned long outvalue = 0, invalue = 0;
-       unsigned long msrval;
        struct cpufreq_freqs freqs;
  
        if (clock_ratio[best_i].index > max_multiplier) {
  
        freqs.old = busfreq * powernow_k6_get_cpu_multiplier();
        freqs.new = busfreq * clock_ratio[best_i].index;
 +      freqs.cpu = 0; /* powernow-k6.c is UP only driver */
  
 -      cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
 +      cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
  
-       /* we now need to transform best_i to the BVC format, see AMD#23446 */
-       outvalue = (1<<12) | (1<<10) | (1<<9) | (best_i<<5);
-       msrval = POWERNOW_IOPORT + 0x1;
-       wrmsr(MSR_K6_EPMR, msrval, 0); /* enable the PowerNow port */
-       invalue = inl(POWERNOW_IOPORT + 0x8);
-       invalue = invalue & 0xf;
-       outvalue = outvalue | invalue;
-       outl(outvalue , (POWERNOW_IOPORT + 0x8));
-       msrval = POWERNOW_IOPORT + 0x0;
-       wrmsr(MSR_K6_EPMR, msrval, 0); /* disable it again */
+       powernow_k6_set_cpu_multiplier(best_i);
  
 -      cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
 +      cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
  
        return;
  }
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 3cb11cfa31f6d679cbefa118dd8b69de85689e2c,4e11218d644ecfb1e2551d4d81c327f0f64d8b06..9cd4ea0f94858cb9e39bbd0f02b900d3aa54f90d
@@@ -478,12 -247,8 +478,17 @@@ static int gic_set_affinity(struct irq_
  {
        void __iomem *reg = gic_dist_base(d) + GIC_DIST_TARGET + (gic_irq(d) & ~3);
        unsigned int cpu, shift = (gic_irq(d) % 4) * 8;
 +      struct gic_chip_data *gic = irq_data_get_irq_chip_data(d);
        u32 val, mask, bit;
 +#ifdef CONFIG_GIC_SET_MULTIPLE_CPUS
 +      struct irq_desc *desc = irq_to_desc(d->irq);
 +#endif
 +
++      if (!force)
++              cpu = cpumask_any_and(mask_val, cpu_online_mask);
++      else
++              cpu = cpumask_first(mask_val);
        if (!force)
                cpu = cpumask_any_and(mask_val, cpu_online_mask);
        else
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index c74828d3175f208a3fee7198011a9e0778d5aa02,a86d1232613739ec70837326b2bd2aadbb5408cd..bc659b00e018c34b05a24256808f4d71aee8347c
@@@ -1101,37 -919,7 +1101,38 @@@ static int machine_constraints_voltage(
        return 0;
  }
  
 +static int machine_constraints_current(struct regulator_dev *rdev,
 +      struct regulation_constraints *constraints)
 +{
 +      struct regulator_ops *ops = rdev->desc->ops;
 +      int ret;
 +
 +      if (constraints->ignore_current_constraint_init)
 +              return 0;
 +      if (!constraints->min_uA && !constraints->max_uA)
 +              return 0;
 +
 +      if (constraints->min_uA > constraints->max_uA) {
 +              rdev_err(rdev, "Invalid current constraints\n");
 +              return -EINVAL;
 +      }
 +
 +      if (!ops->set_current_limit || !ops->get_current_limit) {
 +              rdev_warn(rdev, "Operation of current configuration missing\n");
 +              return 0;
 +      }
 +
 +      /* Set regulator current in constraints range */
 +      ret = ops->set_current_limit(rdev, constraints->min_uA,
 +                      constraints->max_uA);
 +      if (ret < 0) {
 +              rdev_err(rdev, "Failed to set current constraint, %d\n", ret);
 +              return ret;
 +      }
 +
 +      return 0;
 +}
+ static int _regulator_do_enable(struct regulator_dev *rdev);
  
  /**
   * set_machine_constraints - sets regulator constraints
@@@ -2051,9 -1732,11 +2051,11 @@@ static int _regulator_disable(struct re
                if (_regulator_can_change_status(rdev)) {
                        ret = _regulator_do_disable(rdev);
                        if (ret < 0) {
 -                              rdev_err(rdev, "failed to disable\n");
 +                              rdev_err(rdev, "failed to disable: %d\n", ret);
                                return ret;
                        }
+                       _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE,
+                                       NULL);
                }
  
                rdev->use_count = 0;
Simple merge
index 21e4a7142692a5adc463c624bc62b605d220b768,fbf3f11aed2c6c2914e8c7c0ea9fdf2f2e1465a1..690029b8180db2f5e51e3de19ce55e556bc47a06
@@@ -1247,10 -1212,9 +1269,11 @@@ made_compressed_probe
        acm->is_int_ep = usb_endpoint_xfer_int(epread);
        if (acm->is_int_ep)
                acm->bInterval = epread->bInterval;
 +      if (quirks & NO_HANGUP_IN_RESET_RESUME)
 +              acm->no_hangup_in_reset_resume = 1;
        tty_port_init(&acm->port);
        acm->port.ops = &acm_port_ops;
+       init_usb_anchor(&acm->delayed);
  
        buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
        if (!buf) {
@@@ -1447,6 -1406,6 +1470,7 @@@ static void acm_disconnect(struct usb_i
        struct acm *acm = usb_get_intfdata(intf);
        struct usb_device *usb_dev = interface_to_usbdev(intf);
        struct tty_struct *tty;
++      struct urb *res;
        int i;
  
        dev_dbg(&intf->dev, "%s\n", __func__);
@@@ -1500,23 -1459,15 +1524,20 @@@ static int acm_suspend(struct usb_inter
        struct acm *acm = usb_get_intfdata(intf);
        int cnt;
  
 +      if (!acm) {
 +              pr_err("%s: !acm\n", __func__);
 +              return -ENODEV;
 +      }
 +
+       spin_lock_irq(&acm->read_lock);
+       spin_lock(&acm->write_lock);
        if (PMSG_IS_AUTO(message)) {
-               int b;
-               spin_lock_irq(&acm->write_lock);
-               b = acm->transmitting;
-               spin_unlock_irq(&acm->write_lock);
-               if (b)
+               if (acm->transmitting) {
+                       spin_unlock(&acm->write_lock);
+                       spin_unlock_irq(&acm->read_lock);
                        return -EBUSY;
+               }
        }
-       spin_lock_irq(&acm->read_lock);
-       spin_lock(&acm->write_lock);
        cnt = acm->susp_count++;
        spin_unlock(&acm->write_lock);
        spin_unlock_irq(&acm->read_lock);
  static int acm_resume(struct usb_interface *intf)
  {
        struct acm *acm = usb_get_intfdata(intf);
-       struct acm_wb *wb;
+       struct urb *urb;
        int rv = 0;
-       int cnt;
  
 +      if (!acm) {
 +              pr_err("%s: !acm\n", __func__);
 +              return -ENODEV;
 +      }
 +
        spin_lock_irq(&acm->read_lock);
-       if (acm->susp_count > 0) {
-               acm->susp_count -= 1;
-               cnt = acm->susp_count;
-       } else {
-               spin_unlock_irq(&acm->read_lock);
-               return 0;
-       }
-       spin_unlock_irq(&acm->read_lock);
+       spin_lock(&acm->write_lock);
++      if (acm->susp_count <= 0)
++              goto out;
  
-       if (cnt)
-               return 0;
+       if (--acm->susp_count)
+               goto out;
  
        if (test_bit(ASYNCB_INITIALIZED, &acm->port.flags)) {
-               rv = usb_submit_urb(acm->ctrlurb, GFP_NOIO);
-               spin_lock_irq(&acm->write_lock);
-               if (acm->delayed_wb) {
-                       wb = acm->delayed_wb;
-                       acm->delayed_wb = NULL;
-                       spin_unlock_irq(&acm->write_lock);
-                       acm_start_wb(acm, wb);
-               } else {
-                       spin_unlock_irq(&acm->write_lock);
+               rv = usb_submit_urb(acm->ctrlurb, GFP_ATOMIC);
+               for (;;) {
+                       urb = usb_get_from_anchor(&acm->delayed);
+                       if (!urb)
+                               break;
+                       acm_start_wb(acm, urb->context);
                }
  
                /*
index 0d4fcfd7a22c90ec2aaa7ea9a39fb1639b50eadf,1683ac161cf6b2aa7f8d2b0a2b9455a5b2722d75..9f0390d60058a3e04d1cd40b7780ac36e8c4a666
@@@ -118,12 -114,10 +118,12 @@@ struct acm 
        unsigned int susp_count;                        /* number of suspended interfaces */
        unsigned int combined_interfaces:1;             /* control and data collapsed */
        unsigned int is_int_ep:1;                       /* interrupt endpoints contrary to spec used */
 +      unsigned int int_throttled:1;                   /* internal throttled */
        unsigned int throttled:1;                       /* actually throttled */
        unsigned int throttle_req:1;                    /* throttle requested */
 +      unsigned int no_hangup_in_reset_resume:1;       /* do not call tty_hangup in acm_reset_resume */
        u8 bInterval;
-       struct acm_wb *delayed_wb;                      /* write queued for a device about to be woken */
+       struct usb_anchor delayed;                      /* writes queued for a device about to be woken */
  };
  
  #define CDC_DATA_INTERFACE_TYPE       0x0a
index 6ff9ad9ece0ebf70aa99016a0d64966a471e6e49,46efdca96952705541f2decafb654c0c437de050..f290ea64e1456d06f03c7333256c4c40b297b95f
@@@ -1648,8 -1648,54 +1648,19 @@@ static int hub_probe(struct usb_interfa
        desc = intf->cur_altsetting;
        hdev = interface_to_usbdev(intf);
  
-       /* Hubs have proper suspend/resume support. */
-       usb_enable_autosuspend(hdev);
 -      /*
 -       * Set default autosuspend delay as 0 to speedup bus suspend,
 -       * based on the below considerations:
 -       *
 -       * - Unlike other drivers, the hub driver does not rely on the
 -       *   autosuspend delay to provide enough time to handle a wakeup
 -       *   event, and the submitted status URB is just to check future
 -       *   change on hub downstream ports, so it is safe to do it.
 -       *
 -       * - The patch might cause one or more auto supend/resume for
 -       *   below very rare devices when they are plugged into hub
 -       *   first time:
 -       *
 -       *      devices having trouble initializing, and disconnect
 -       *      themselves from the bus and then reconnect a second
 -       *      or so later
 -       *
 -       *      devices just for downloading firmware, and disconnects
 -       *      themselves after completing it
 -       *
 -       *   For these quite rare devices, their drivers may change the
 -       *   autosuspend delay of their parent hub in the probe() to one
 -       *   appropriate value to avoid the subtle problem if someone
 -       *   does care it.
 -       *
 -       * - The patch may cause one or more auto suspend/resume on
 -       *   hub during running 'lsusb', but it is probably too
 -       *   infrequent to worry about.
 -       *
 -       * - Change autosuspend delay of hub can avoid unnecessary auto
 -       *   suspend timer for hub, also may decrease power consumption
 -       *   of USB bus.
 -       */
 -      pm_runtime_set_autosuspend_delay(&hdev->dev, 0);
 -
+       /*
+        * Hubs have proper suspend/resume support, except for root hubs
+        * where the controller driver doesn't have bus_suspend and
+        * bus_resume methods.
+        */
+       if (hdev->parent) {             /* normal device */
+               usb_enable_autosuspend(hdev);
+       } else {                        /* root hub */
+               const struct hc_driver *drv = bus_to_hcd(hdev->bus)->driver;
+               if (drv->bus_suspend && drv->bus_resume)
+                       usb_enable_autosuspend(hdev);
+       }
  
        if (hdev->level == MAX_TOPO_LEVEL) {
                dev_err(&intf->dev,
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc fs/exec.c
Simple merge
Simple merge
Simple merge
diff --cc fs/ext4/super.c
Simple merge
Simple merge
diff --cc fs/inode.c
Simple merge
diff --cc fs/nfs/inode.c
Simple merge
Simple merge
diff --cc fs/proc/base.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc init/Kconfig
Simple merge
diff --cc kernel/cpu.c
Simple merge
diff --cc kernel/exit.c
Simple merge
diff --cc kernel/fork.c
Simple merge
diff --cc kernel/futex.c
Simple merge
Simple merge
diff --cc kernel/module.c
Simple merge
Simple merge
diff --cc kernel/sysctl.c
Simple merge
Simple merge
diff --cc kernel/timer.c
Simple merge
index 903fc104bf511a6e1b5b22e398850edda682feb8,8fe92ce43f39fc7a85b5c937533e22a089e6a56f..3a1b7d5f6db1c068ecdd10e58fa8dd7ad9bbabdb
@@@ -1439,9 -1435,10 +1437,11 @@@ static int trace_save_cmdline(struct ta
        }
  
        memcpy(&saved_cmdlines[idx], tsk->comm, TASK_COMM_LEN);
 +      saved_tgids[idx] = tsk->tgid;
  
        arch_spin_unlock(&trace_cmdline_lock);
+       return 1;
  }
  
  void trace_find_cmdline(int pid, char comm[])
Simple merge
Simple merge
Simple merge
diff --cc mm/compaction.c
Simple merge
diff --cc mm/memcontrol.c
Simple merge
diff --cc mm/memory.c
Simple merge
diff --cc mm/mempolicy.c
Simple merge
diff --cc mm/mlock.c
Simple merge
diff --cc mm/page_alloc.c
Simple merge
diff --cc mm/vmscan.c
Simple merge
Simple merge
index 49d5c941c9c7efcca1cb24c6a477fcd9d27ceb86,5daf7ab26710b06336abf853bb5e8a1c51b5cc7f..1526fb232b3f16dc4146d198248a91bc335a7572
mode 100755,100644..100755
Simple merge
Simple merge
diff --cc net/core/sock.c
Simple merge
Simple merge
diff --cc net/ipv4/tcp.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc net/ipv6/icmp.c
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc net/socket.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge