Merge tag 'pm+acpi-3.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 3 Sep 2013 22:59:39 +0000 (15:59 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 3 Sep 2013 22:59:39 +0000 (15:59 -0700)
Pull ACPI and power management updates from Rafael Wysocki:

 1) ACPI-based PCI hotplug (ACPIPHP) subsystem rework and introduction
    of Intel Thunderbolt support on systems that use ACPI for signalling
    Thunderbolt hotplug events.  This also should make ACPIPHP work in
    some cases in which it was known to have problems.  From
    Rafael J Wysocki, Mika Westerberg and Kirill A Shutemov.

 2) ACPI core code cleanups and dock station support cleanups from
    Jiang Liu and Rafael J Wysocki.

 3) Fixes for locking problems related to ACPI device hotplug from
    Rafael J Wysocki.

 4) ACPICA update to version 20130725 includig fixes, cleanups, support
    for more than 256 GPEs per GPE block and a change to make the ACPI
    PM Timer optional (we've seen systems without the PM Timer in the
    field already).  One of the fixes, related to the DeRefOf operator,
    is necessary to prevent some Windows 8 oriented AML from causing
    problems to happen.  From Bob Moore, Lv Zheng, and Jung-uk Kim.

 5) Removal of the old and long deprecated /proc/acpi/event interface
    and related driver changes from Thomas Renninger.

 6) ACPI and Xen changes to make the reduced hardware sleep work with
    the latter from Ben Guthro.

 7) ACPI video driver cleanups and a blacklist of systems that should
    not tell the BIOS that they are compatible with Windows 8 (or ACPI
    backlight and possibly other things will not work on them).  From
    Felipe Contreras.

 8) Assorted ACPI fixes and cleanups from Aaron Lu, Hanjun Guo,
    Kuppuswamy Sathyanarayanan, Lan Tianyu, Sachin Kamat, Tang Chen,
    Toshi Kani, and Wei Yongjun.

 9) cpufreq ondemand governor target frequency selection change to
    reduce oscillations between min and max frequencies (essentially,
    it causes the governor to choose target frequencies proportional
    to load) from Stratos Karafotis.

10) cpufreq fixes allowing sysfs attributes file permissions to be
    preserved over suspend/resume cycles Srivatsa S Bhat.

11) Removal of Device Tree parsing for CPU device nodes from multiple
    cpufreq drivers that required some changes related to
    of_get_cpu_node() to be made in a few architectures and in the
    driver core.  From Sudeep KarkadaNagesha.

12) cpufreq core fixes and cleanups related to mutual exclusion and
    driver module references from Viresh Kumar, Lukasz Majewski and
    Rafael J Wysocki.

13) Assorted cpufreq fixes and cleanups from Amit Daniel Kachhap,
    Bartlomiej Zolnierkiewicz, Hanjun Guo, Jingoo Han, Joseph Lo,
    Julia Lawall, Li Zhong, Mark Brown, Sascha Hauer, Stephen Boyd,
    Stratos Karafotis, and Viresh Kumar.

14) Fixes to prevent race conditions in coupled cpuidle from happening
    from Colin Cross.

15) cpuidle core fixes and cleanups from Daniel Lezcano and
    Tuukka Tikkanen.

16) Assorted cpuidle fixes and cleanups from Daniel Lezcano,
    Geert Uytterhoeven, Jingoo Han, Julia Lawall, Linus Walleij,
    and Sahara.

17) System sleep tracing changes from Todd E Brandt and Shuah Khan.

18) PNP subsystem conversion to using struct dev_pm_ops for power
    management from Shuah Khan.

* tag 'pm+acpi-3.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (217 commits)
  cpufreq: Don't use smp_processor_id() in preemptible context
  cpuidle: coupled: fix race condition between pokes and safe state
  cpuidle: coupled: abort idle if pokes are pending
  cpuidle: coupled: disable interrupts after entering safe state
  ACPI / hotplug: Remove containers synchronously
  driver core / ACPI: Avoid device hot remove locking issues
  cpufreq: governor: Fix typos in comments
  cpufreq: governors: Remove duplicate check of target freq in supported range
  cpufreq: Fix timer/workqueue corruption due to double queueing
  ACPI / EC: Add ASUSTEK L4R to quirk list in order to validate ECDT
  ACPI / thermal: Add check of "_TZD" availability and evaluating result
  cpufreq: imx6q: Fix clock enable balance
  ACPI: blacklist win8 OSI for buggy laptops
  cpufreq: tegra: fix the wrong clock name
  cpuidle: Change struct menu_device field types
  cpuidle: Add a comment warning about possible overflow
  cpuidle: Fix variable domains in get_typical_interval()
  cpuidle: Fix menu_device->intervals type
  cpuidle: CodingStyle: Break up multiple assignments on single line
  cpuidle: Check called function parameter in get_typical_interval()
  ...

1  2 
Documentation/kernel-parameters.txt
drivers/base/core.c
drivers/base/cpu.c
drivers/base/memory.c
drivers/cpufreq/cpufreq-cpu0.c
drivers/of/base.c
include/linux/device.h
include/linux/of.h

Simple merge
@@@ -1450,18 -1489,21 +1475,6 @@@ int __init devices_init(void
        return -ENOMEM;
  }
  
- static DEFINE_MUTEX(device_hotplug_lock);
 -EXPORT_SYMBOL_GPL(device_for_each_child);
 -EXPORT_SYMBOL_GPL(device_find_child);
--
- void lock_device_hotplug(void)
- {
-       mutex_lock(&device_hotplug_lock);
- }
 -EXPORT_SYMBOL_GPL(device_initialize);
 -EXPORT_SYMBOL_GPL(device_add);
 -EXPORT_SYMBOL_GPL(device_register);
--
- void unlock_device_hotplug(void)
- {
-       mutex_unlock(&device_hotplug_lock);
- }
 -EXPORT_SYMBOL_GPL(device_del);
 -EXPORT_SYMBOL_GPL(device_unregister);
 -EXPORT_SYMBOL_GPL(get_device);
 -EXPORT_SYMBOL_GPL(put_device);
 -
 -EXPORT_SYMBOL_GPL(device_create_file);
 -EXPORT_SYMBOL_GPL(device_remove_file);
--
  static int device_check_offline(struct device *dev, void *not_used)
  {
        int ret;
Simple merge
@@@ -318,42 -345,35 +318,44 @@@ static ssize_
  store_mem_state(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t count)
  {
 -      struct memory_block *mem;
 -      bool offline;
 -      int ret = -EINVAL;
 -
 -      mem = container_of(dev, struct memory_block, dev);
 +      struct memory_block *mem = to_memory_block(dev);
 +      int ret, online_type;
  
-       lock_device_hotplug();
+       ret = lock_device_hotplug_sysfs();
+       if (ret)
+               return ret;
  
 -      if (!strncmp(buf, "online_kernel", min_t(int, count, 13))) {
 -              offline = false;
 -              ret = memory_block_change_state(mem, MEM_ONLINE,
 -                                              MEM_OFFLINE, ONLINE_KERNEL);
 -      } else if (!strncmp(buf, "online_movable", min_t(int, count, 14))) {
 -              offline = false;
 -              ret = memory_block_change_state(mem, MEM_ONLINE,
 -                                              MEM_OFFLINE, ONLINE_MOVABLE);
 -      } else if (!strncmp(buf, "online", min_t(int, count, 6))) {
 -              offline = false;
 -              ret = memory_block_change_state(mem, MEM_ONLINE,
 -                                              MEM_OFFLINE, ONLINE_KEEP);
 -      } else if(!strncmp(buf, "offline", min_t(int, count, 7))) {
 -              offline = true;
 -              ret = memory_block_change_state(mem, MEM_OFFLINE,
 -                                              MEM_ONLINE, -1);
 +      if (!strncmp(buf, "online_kernel", min_t(int, count, 13)))
 +              online_type = ONLINE_KERNEL;
 +      else if (!strncmp(buf, "online_movable", min_t(int, count, 14)))
 +              online_type = ONLINE_MOVABLE;
 +      else if (!strncmp(buf, "online", min_t(int, count, 6)))
 +              online_type = ONLINE_KEEP;
 +      else if (!strncmp(buf, "offline", min_t(int, count, 7)))
 +              online_type = -1;
 +      else
 +              return -EINVAL;
 +
 +      switch (online_type) {
 +      case ONLINE_KERNEL:
 +      case ONLINE_MOVABLE:
 +      case ONLINE_KEEP:
 +              /*
 +               * mem->online_type is not protected so there can be a
 +               * race here.  However, when racing online, the first
 +               * will succeed and the second will just return as the
 +               * block will already be online.  The online type
 +               * could be either one, but that is expected.
 +               */
 +              mem->online_type = online_type;
 +              ret = device_online(&mem->dev);
 +              break;
 +      case -1:
 +              ret = device_offline(&mem->dev);
 +              break;
 +      default:
 +              ret = -EINVAL; /* should never happen */
        }
 -      if (!ret)
 -              dev->offline = offline;
  
        unlock_device_hotplug();
  
@@@ -174,30 -174,18 +174,18 @@@ static struct cpufreq_driver cpu0_cpufr
  
  static int cpu0_cpufreq_probe(struct platform_device *pdev)
  {
-       struct device_node *np, *parent;
+       struct device_node *np;
        int ret;
  
-       parent = of_find_node_by_path("/cpus");
-       if (!parent) {
-               pr_err("failed to find OF /cpus\n");
-               return -ENOENT;
-       }
-       for_each_child_of_node(parent, np) {
-               if (of_get_property(np, "operating-points", NULL))
-                       break;
-       }
+       cpu_dev = &pdev->dev;
  
+       np = of_node_get(cpu_dev->of_node);
        if (!np) {
                pr_err("failed to find cpu0 node\n");
-               ret = -ENOENT;
-               goto out_put_parent;
+               return -ENOENT;
        }
  
-       cpu_dev = &pdev->dev;
-       cpu_dev->of_node = np;
 -      cpu_reg = devm_regulator_get(cpu_dev, "cpu0");
 +      cpu_reg = devm_regulator_get_optional(cpu_dev, "cpu0");
        if (IS_ERR(cpu_reg)) {
                /*
                 * If cpu0 regulator supply node is present, but regulator is
Simple merge
Simple merge
Simple merge