Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eef445ee authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull ACPI and power management fixes from Rafael Wysocki:
 "These include a fix for a recent intel_pstate regression, a fix for a
  regression in the ACPI-based PCI hotplug (ACPIPHP) code introduced
  during the 3.12 cycle, fixes for two bugs in the ACPI core introduced
  recently and a MAINTAINERS update related to cpufreq.

  Specifics:

   - Fix for a recent regression in the intel_pstate driver that
     introduced a race condition causing systems to crash during
     initialization in some situations.  This removes the affected code
     altogether.  From Dirk Brandewie.

   - ACPIPHP fix for a regression introduced during the 3.12 cycle
     causing devices to be dropped as a result of bus check
     notifications after system resume on some systems due to the way
     ACPIPHP interprets _STA return values (arguably incorrectly).  From
     Mika Westerberg.

   - ACPI dock driver fix for a problem causing docking to fail due to a
     check that always fails after recent ACPI core changes (found by
     code inspection).

   - ACPI container driver fix to prevent memory from being leaked in an
     error code path after device_register() failures.

   - Update of the arm_big_little cpufreq driver maintainer's e-mail
     address"

* tag 'pm+acpi-3.14-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  MAINTAINERS / cpufreq: update Sudeep's email address
  intel_pstate: Remove energy reporting from pstate_sample tracepoint
  ACPI / container: Fix error code path in container_device_attach()
  ACPI / hotplug / PCI: Relax the checking of _STA return values
  ACPI / dock: Use acpi_device_enumerated() to check if dock is present
parents 3bd354ab 465e5fc4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2367,7 +2367,7 @@ F: include/linux/cpufreq.h

CPU FREQUENCY DRIVERS - ARM BIG LITTLE
M:	Viresh Kumar <viresh.kumar@linaro.org>
M:	Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
M:	Sudeep Holla <sudeep.holla@arm.com>
L:	cpufreq@vger.kernel.org
L:	linux-pm@vger.kernel.org
W:	http://www.arm.com/products/processors/technologies/biglittleprocessing.php
+3 −2
Original line number Diff line number Diff line
@@ -79,9 +79,10 @@ static int container_device_attach(struct acpi_device *adev,
	ACPI_COMPANION_SET(dev, adev);
	dev->release = acpi_container_release;
	ret = device_register(dev);
	if (ret)
	if (ret) {
		put_device(dev);
		return ret;

	}
	adev->driver_data = dev;
	return 1;
}
+3 −2
Original line number Diff line number Diff line
@@ -609,7 +609,7 @@ static int handle_eject_request(struct dock_station *ds, u32 event)
static void dock_notify(struct dock_station *ds, u32 event)
{
	acpi_handle handle = ds->handle;
	struct acpi_device *ad;
	struct acpi_device *adev = NULL;
	int surprise_removal = 0;

	/*
@@ -632,7 +632,8 @@ static void dock_notify(struct dock_station *ds, u32 event)
	switch (event) {
	case ACPI_NOTIFY_BUS_CHECK:
	case ACPI_NOTIFY_DEVICE_CHECK:
		if (!dock_in_progress(ds) && acpi_bus_get_device(handle, &ad)) {
		acpi_bus_get_device(handle, &adev);
		if (!dock_in_progress(ds) && !acpi_device_enumerated(adev)) {
			begin_dock(ds);
			dock(ds);
			if (!dock_present(ds)) {
+0 −9
Original line number Diff line number Diff line
@@ -51,8 +51,6 @@ static inline int32_t div_fp(int32_t x, int32_t y)
	return div_s64((int64_t)x << FRAC_BITS, (int64_t)y);
}

static u64 energy_divisor;

struct sample {
	int32_t core_pct_busy;
	u64 aperf;
@@ -630,12 +628,10 @@ static void intel_pstate_timer_func(unsigned long __data)
{
	struct cpudata *cpu = (struct cpudata *) __data;
	struct sample *sample;
	u64 energy;

	intel_pstate_sample(cpu);

	sample = &cpu->samples[cpu->sample_ptr];
	rdmsrl(MSR_PKG_ENERGY_STATUS, energy);

	intel_pstate_adjust_busy_pstate(cpu);

@@ -644,7 +640,6 @@ static void intel_pstate_timer_func(unsigned long __data)
			cpu->pstate.current_pstate,
			sample->mperf,
			sample->aperf,
			div64_u64(energy, energy_divisor),
			sample->freq);

	intel_pstate_set_sample_time(cpu);
@@ -926,7 +921,6 @@ static int __init intel_pstate_init(void)
	int cpu, rc = 0;
	const struct x86_cpu_id *id;
	struct cpu_defaults *cpu_info;
	u64 units;

	if (no_load)
		return -ENODEV;
@@ -960,9 +954,6 @@ static int __init intel_pstate_init(void)
	if (rc)
		goto out;

	rdmsrl(MSR_RAPL_POWER_UNIT, units);
	energy_divisor = 1 << ((units >> 8) & 0x1f); /* bits{12:8} */

	intel_pstate_debug_expose_params();
	intel_pstate_sysfs_expose_params();

+13 −2
Original line number Diff line number Diff line
@@ -730,6 +730,17 @@ static unsigned int get_slot_status(struct acpiphp_slot *slot)
	return (unsigned int)sta;
}

static inline bool device_status_valid(unsigned int sta)
{
	/*
	 * ACPI spec says that _STA may return bit 0 clear with bit 3 set
	 * if the device is valid but does not require a device driver to be
	 * loaded (Section 6.3.7 of ACPI 5.0A).
	 */
	unsigned int mask = ACPI_STA_DEVICE_ENABLED | ACPI_STA_DEVICE_FUNCTIONING;
	return (sta & mask) == mask;
}

/**
 * trim_stale_devices - remove PCI devices that are not responding.
 * @dev: PCI device to start walking the hierarchy from.
@@ -745,7 +756,7 @@ static void trim_stale_devices(struct pci_dev *dev)
		unsigned long long sta;

		status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
		alive = (ACPI_SUCCESS(status) && sta == ACPI_STA_ALL)
		alive = (ACPI_SUCCESS(status) && device_status_valid(sta))
			|| acpiphp_no_hotplug(handle);
	}
	if (!alive) {
@@ -792,7 +803,7 @@ static void acpiphp_check_bridge(struct acpiphp_bridge *bridge)
		mutex_lock(&slot->crit_sect);
		if (slot_no_hotplug(slot)) {
			; /* do nothing */
		} else if (get_slot_status(slot) == ACPI_STA_ALL) {
		} else if (device_status_valid(get_slot_status(slot))) {
			/* remove stale devices if any */
			list_for_each_entry_safe_reverse(dev, tmp,
							 &bus->devices, bus_list)
Loading