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

Commit b63b1e57 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull ACPI fixes from Rafael Wysocki:
 "These fix a system resume regression from the 4.13 cycle, clean up
  device table handling in the ACPI core, update sysfs ABI documentation
  of a couple of drivers and add an expected switch fall-through marker
  to the SPCR table parsing code.

  Specifics:

   - Revert a problematic EC driver change from the 4.13 cycle that
     introduced a system resume regression on Thinkpad X240 (Rafael
     Wysocki).

   - Clean up device tables handling in the ACPI core and the related
     part of the device properties framework (Andy Shevchenko).

   - Update the sysfs ABI documentatio of the dock and the INT3407
     special device drivers (Aishwarya Pant).

   - Add an expected switch fall-through marker to the SPCR table
     parsing code (Gustavo Silva)"

* tag 'acpi-4.16-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  ACPI: dock: document sysfs interface
  ACPI / DPTF: Document dptf_power sysfs atttributes
  device property: Constify device_get_match_data()
  ACPI / bus: Rename acpi_get_match_data() to acpi_device_get_match_data()
  ACPI / bus: Remove checks in acpi_get_match_data()
  ACPI / bus: Do not traverse through non-existed device table
  ACPI: SPCR: Mark expected switch fall-through in acpi_parse_spcr
  ACPI / EC: Restore polling during noirq suspend/resume phases
parents 8bb89666 31a3be35
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
What:		/sys/devices/platform/dock.N/docked
Date:		Dec, 2006
KernelVersion:	2.6.19
Contact:	linux-acpi@vger.kernel.org
Description:
		(RO) Value 1 or 0 indicates whether the software believes the
		laptop is docked in a docking station.

What:		/sys/devices/platform/dock.N/undock
Date:		Dec, 2006
KernelVersion:	2.6.19
Contact:	linux-acpi@vger.kernel.org
Description:
		(WO) Writing to this file causes the software to initiate an
		undock request to the firmware.

What:		/sys/devices/platform/dock.N/uid
Date:		Feb, 2007
KernelVersion:	v2.6.21
Contact:	linux-acpi@vger.kernel.org
Description:
		(RO) Displays the docking station the laptop is docked to.

What:		/sys/devices/platform/dock.N/flags
Date:		May, 2007
KernelVersion:	v2.6.21
Contact:	linux-acpi@vger.kernel.org
Description:
		(RO) Show dock station flags, useful for checking if undock
		request has been made by the user (from the immediate_undock
		option).

What:		/sys/devices/platform/dock.N/type
Date:		Aug, 2008
KernelVersion:	v2.6.27
Contact:	linux-acpi@vger.kernel.org
Description:
		(RO) Display the dock station type- dock_station, ata_bay or
		battery_bay.
+40 −0
Original line number Diff line number Diff line
What:		/sys/bus/platform/devices/INT3407:00/dptf_power/charger_type
Date:		Jul, 2016
KernelVersion:	v4.10
Contact:	linux-acpi@vger.kernel.org
Description:
		(RO) The charger type - Traditional, Hybrid or NVDC.

What:		/sys/bus/platform/devices/INT3407:00/dptf_power/adapter_rating_mw
Date:		Jul, 2016
KernelVersion:	v4.10
Contact:	linux-acpi@vger.kernel.org
Description:
		(RO) Adapter rating in milliwatts (the maximum Adapter power).
		Must be 0 if no AC Adaptor is plugged in.

What:		/sys/bus/platform/devices/INT3407:00/dptf_power/max_platform_power_mw
Date:		Jul, 2016
KernelVersion:	v4.10
Contact:	linux-acpi@vger.kernel.org
Description:
		(RO) Maximum platform power that can be supported by the battery
		in milliwatts.

What:		/sys/bus/platform/devices/INT3407:00/dptf_power/platform_power_source
Date:		Jul, 2016
KernelVersion:	v4.10
Contact:	linux-acpi@vger.kernel.org
Description:
		(RO) Display the platform power source
		0x00 = DC
		0x01 = AC
		0x02 = USB
		0x03 = Wireless Charger

What:		/sys/bus/platform/devices/INT3407:00/dptf_power/battery_steady_power
Date:		Jul, 2016
KernelVersion:	v4.10
Contact:	linux-acpi@vger.kernel.org
Description:
		(RO) The maximum sustained power for battery in milliwatts.
+41 −34
Original line number Diff line number Diff line
@@ -660,13 +660,15 @@ struct acpi_device *acpi_companion_match(const struct device *dev)
 * acpi_of_match_device - Match device object using the "compatible" property.
 * @adev: ACPI device object to match.
 * @of_match_table: List of device IDs to match against.
 * @of_id: OF ID if matched
 *
 * If @dev has an ACPI companion which has ACPI_DT_NAMESPACE_HID in its list of
 * identifiers and a _DSD object with the "compatible" property, use that
 * property to match against the given list of identifiers.
 */
static bool acpi_of_match_device(struct acpi_device *adev,
				 const struct of_device_id *of_match_table)
				 const struct of_device_id *of_match_table,
				 const struct of_device_id **of_id)
{
	const union acpi_object *of_compatible, *obj;
	int i, nval;
@@ -690,9 +692,12 @@ static bool acpi_of_match_device(struct acpi_device *adev,
		const struct of_device_id *id;

		for (id = of_match_table; id->compatible[0]; id++)
			if (!strcasecmp(obj->string.pointer, id->compatible))
			if (!strcasecmp(obj->string.pointer, id->compatible)) {
				if (of_id)
					*of_id = id;
				return true;
			}
	}

	return false;
}
@@ -762,10 +767,11 @@ static bool __acpi_match_device_cls(const struct acpi_device_id *id,
	return true;
}

static const struct acpi_device_id *__acpi_match_device(
	struct acpi_device *device,
	const struct acpi_device_id *ids,
	const struct of_device_id *of_ids)
static bool __acpi_match_device(struct acpi_device *device,
				const struct acpi_device_id *acpi_ids,
				const struct of_device_id *of_ids,
				const struct acpi_device_id **acpi_id,
				const struct of_device_id **of_id)
{
	const struct acpi_device_id *id;
	struct acpi_hardware_id *hwid;
@@ -775,30 +781,32 @@ static const struct acpi_device_id *__acpi_match_device(
	 * driver for it.
	 */
	if (!device || !device->status.present)
		return NULL;
		return false;

	list_for_each_entry(hwid, &device->pnp.ids, list) {
		/* First, check the ACPI/PNP IDs provided by the caller. */
		for (id = ids; id->id[0] || id->cls; id++) {
		if (acpi_ids) {
			for (id = acpi_ids; id->id[0] || id->cls; id++) {
				if (id->id[0] && !strcmp((char *)id->id, hwid->id))
				return id;
			else if (id->cls && __acpi_match_device_cls(id, hwid))
				return id;
					goto out_acpi_match;
				if (id->cls && __acpi_match_device_cls(id, hwid))
					goto out_acpi_match;
			}
		}

		/*
		 * Next, check ACPI_DT_NAMESPACE_HID and try to match the
		 * "compatible" property if found.
		 *
		 * The id returned by the below is not valid, but the only
		 * caller passing non-NULL of_ids here is only interested in
		 * whether or not the return value is NULL.
		 */
		if (!strcmp(ACPI_DT_NAMESPACE_HID, hwid->id)
		    && acpi_of_match_device(device, of_ids))
			return id;
		if (!strcmp(ACPI_DT_NAMESPACE_HID, hwid->id))
			return acpi_of_match_device(device, of_ids, of_id);
	}
	return NULL;
	return false;

out_acpi_match:
	if (acpi_id)
		*acpi_id = id;
	return true;
}

/**
@@ -815,32 +823,29 @@ static const struct acpi_device_id *__acpi_match_device(
const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,
					       const struct device *dev)
{
	return __acpi_match_device(acpi_companion_match(dev), ids, NULL);
	const struct acpi_device_id *id = NULL;

	__acpi_match_device(acpi_companion_match(dev), ids, NULL, &id, NULL);
	return id;
}
EXPORT_SYMBOL_GPL(acpi_match_device);

void *acpi_get_match_data(const struct device *dev)
const void *acpi_device_get_match_data(const struct device *dev)
{
	const struct acpi_device_id *match;

	if (!dev->driver)
		return NULL;

	if (!dev->driver->acpi_match_table)
		return NULL;

	match = acpi_match_device(dev->driver->acpi_match_table, dev);
	if (!match)
		return NULL;

	return (void *)match->driver_data;
	return (const void *)match->driver_data;
}
EXPORT_SYMBOL_GPL(acpi_get_match_data);
EXPORT_SYMBOL_GPL(acpi_device_get_match_data);

int acpi_match_device_ids(struct acpi_device *device,
			  const struct acpi_device_id *ids)
{
	return __acpi_match_device(device, ids, NULL) ? 0 : -ENOENT;
	return __acpi_match_device(device, ids, NULL, NULL, NULL) ? 0 : -ENOENT;
}
EXPORT_SYMBOL(acpi_match_device_ids);

@@ -849,10 +854,12 @@ bool acpi_driver_match_device(struct device *dev,
{
	if (!drv->acpi_match_table)
		return acpi_of_match_device(ACPI_COMPANION(dev),
					    drv->of_match_table);
					    drv->of_match_table,
					    NULL);

	return !!__acpi_match_device(acpi_companion_match(dev),
				     drv->acpi_match_table, drv->of_match_table);
	return __acpi_match_device(acpi_companion_match(dev),
				   drv->acpi_match_table, drv->of_match_table,
				   NULL, NULL);
}
EXPORT_SYMBOL_GPL(acpi_driver_match_device);

+6 −0
Original line number Diff line number Diff line
@@ -1927,6 +1927,9 @@ static int acpi_ec_suspend_noirq(struct device *dev)
	    ec->reference_count >= 1)
		acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE);

	if (acpi_sleep_no_ec_events())
		acpi_ec_enter_noirq(ec);

	return 0;
}

@@ -1934,6 +1937,9 @@ static int acpi_ec_resume_noirq(struct device *dev)
{
	struct acpi_ec *ec = acpi_driver_data(to_acpi_device(dev));

	if (acpi_sleep_no_ec_events())
		acpi_ec_leave_noirq(ec);

	if (ec_no_wakeup && test_bit(EC_FLAGS_STARTED, &ec->flags) &&
	    ec->reference_count >= 1)
		acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE);
+2 −2
Original line number Diff line number Diff line
@@ -1271,11 +1271,11 @@ static int acpi_fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
	return 0;
}

static void *
static const void *
acpi_fwnode_device_get_match_data(const struct fwnode_handle *fwnode,
				  const struct device *dev)
{
	return acpi_get_match_data(dev);
	return acpi_device_get_match_data(dev);
}

#define DECLARE_ACPI_FWNODE_OPS(ops) \
Loading