Commit b63b1e57 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'acpi-4.16-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

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
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.
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.
...@@ -660,13 +660,15 @@ struct acpi_device *acpi_companion_match(const struct device *dev) ...@@ -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. * acpi_of_match_device - Match device object using the "compatible" property.
* @adev: ACPI device object to match. * @adev: ACPI device object to match.
* @of_match_table: List of device IDs to match against. * @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 * 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 * identifiers and a _DSD object with the "compatible" property, use that
* property to match against the given list of identifiers. * property to match against the given list of identifiers.
*/ */
static bool acpi_of_match_device(struct acpi_device *adev, 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; const union acpi_object *of_compatible, *obj;
int i, nval; int i, nval;
...@@ -690,8 +692,11 @@ static bool acpi_of_match_device(struct acpi_device *adev, ...@@ -690,8 +692,11 @@ static bool acpi_of_match_device(struct acpi_device *adev,
const struct of_device_id *id; const struct of_device_id *id;
for (id = of_match_table; id->compatible[0]; 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 true;
}
} }
return false; return false;
...@@ -762,10 +767,11 @@ static bool __acpi_match_device_cls(const struct acpi_device_id *id, ...@@ -762,10 +767,11 @@ static bool __acpi_match_device_cls(const struct acpi_device_id *id,
return true; return true;
} }
static const struct acpi_device_id *__acpi_match_device( static bool __acpi_match_device(struct acpi_device *device,
struct acpi_device *device, const struct acpi_device_id *acpi_ids,
const struct acpi_device_id *ids, const struct of_device_id *of_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; const struct acpi_device_id *id;
struct acpi_hardware_id *hwid; struct acpi_hardware_id *hwid;
...@@ -775,30 +781,32 @@ static const struct acpi_device_id *__acpi_match_device( ...@@ -775,30 +781,32 @@ static const struct acpi_device_id *__acpi_match_device(
* driver for it. * driver for it.
*/ */
if (!device || !device->status.present) if (!device || !device->status.present)
return NULL; return false;
list_for_each_entry(hwid, &device->pnp.ids, list) { list_for_each_entry(hwid, &device->pnp.ids, list) {
/* First, check the ACPI/PNP IDs provided by the caller. */ /* First, check the ACPI/PNP IDs provided by the caller. */
for (id = ids; id->id[0] || id->cls; id++) { if (acpi_ids) {
if (id->id[0] && !strcmp((char *) id->id, hwid->id)) for (id = acpi_ids; id->id[0] || id->cls; id++) {
return id; if (id->id[0] && !strcmp((char *)id->id, hwid->id))
else if (id->cls && __acpi_match_device_cls(id, hwid)) goto out_acpi_match;
return id; if (id->cls && __acpi_match_device_cls(id, hwid))
goto out_acpi_match;
}
} }
/* /*
* Next, check ACPI_DT_NAMESPACE_HID and try to match the * Next, check ACPI_DT_NAMESPACE_HID and try to match the
* "compatible" property if found. * "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) if (!strcmp(ACPI_DT_NAMESPACE_HID, hwid->id))
&& acpi_of_match_device(device, of_ids)) return acpi_of_match_device(device, of_ids, of_id);
return 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( ...@@ -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 acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,
const struct device *dev) 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); 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; 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); match = acpi_match_device(dev->driver->acpi_match_table, dev);
if (!match) if (!match)
return NULL; 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, int acpi_match_device_ids(struct acpi_device *device,
const struct acpi_device_id *ids) 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); EXPORT_SYMBOL(acpi_match_device_ids);
...@@ -849,10 +854,12 @@ bool acpi_driver_match_device(struct device *dev, ...@@ -849,10 +854,12 @@ bool acpi_driver_match_device(struct device *dev,
{ {
if (!drv->acpi_match_table) if (!drv->acpi_match_table)
return acpi_of_match_device(ACPI_COMPANION(dev), 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), return __acpi_match_device(acpi_companion_match(dev),
drv->acpi_match_table, drv->of_match_table); drv->acpi_match_table, drv->of_match_table,
NULL, NULL);
} }
EXPORT_SYMBOL_GPL(acpi_driver_match_device); EXPORT_SYMBOL_GPL(acpi_driver_match_device);
......
...@@ -1927,6 +1927,9 @@ static int acpi_ec_suspend_noirq(struct device *dev) ...@@ -1927,6 +1927,9 @@ static int acpi_ec_suspend_noirq(struct device *dev)
ec->reference_count >= 1) ec->reference_count >= 1)
acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE); acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE);
if (acpi_sleep_no_ec_events())
acpi_ec_enter_noirq(ec);
return 0; return 0;
} }
...@@ -1934,6 +1937,9 @@ static int acpi_ec_resume_noirq(struct device *dev) ...@@ -1934,6 +1937,9 @@ static int acpi_ec_resume_noirq(struct device *dev)
{ {
struct acpi_ec *ec = acpi_driver_data(to_acpi_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) && if (ec_no_wakeup && test_bit(EC_FLAGS_STARTED, &ec->flags) &&
ec->reference_count >= 1) ec->reference_count >= 1)
acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE); acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE);
......
...@@ -1271,11 +1271,11 @@ static int acpi_fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode, ...@@ -1271,11 +1271,11 @@ static int acpi_fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
return 0; return 0;
} }
static void * static const void *
acpi_fwnode_device_get_match_data(const struct fwnode_handle *fwnode, acpi_fwnode_device_get_match_data(const struct fwnode_handle *fwnode,
const struct device *dev) const struct device *dev)
{ {
return acpi_get_match_data(dev); return acpi_device_get_match_data(dev);
} }
#define DECLARE_ACPI_FWNODE_OPS(ops) \ #define DECLARE_ACPI_FWNODE_OPS(ops) \
......
...@@ -115,6 +115,7 @@ int __init acpi_parse_spcr(bool enable_earlycon, bool enable_console) ...@@ -115,6 +115,7 @@ int __init acpi_parse_spcr(bool enable_earlycon, bool enable_console)
table->serial_port.access_width))) { table->serial_port.access_width))) {
default: default:
pr_err("Unexpected SPCR Access Width. Defaulting to byte size\n"); pr_err("Unexpected SPCR Access Width. Defaulting to byte size\n");
/* fall through */
case 8: case 8:
iotype = "mmio"; iotype = "mmio";
break; break;
......
...@@ -1410,9 +1410,8 @@ int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode, ...@@ -1410,9 +1410,8 @@ int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
} }
EXPORT_SYMBOL(fwnode_graph_parse_endpoint); EXPORT_SYMBOL(fwnode_graph_parse_endpoint);
void *device_get_match_data(struct device *dev) const void *device_get_match_data(struct device *dev)
{ {
return fwnode_call_ptr_op(dev_fwnode(dev), device_get_match_data, return fwnode_call_ptr_op(dev_fwnode(dev), device_get_match_data, dev);
dev);
} }
EXPORT_SYMBOL_GPL(device_get_match_data); EXPORT_SYMBOL_GPL(device_get_match_data);
...@@ -977,11 +977,11 @@ static int of_fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode, ...@@ -977,11 +977,11 @@ static int of_fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
return 0; return 0;
} }
static void * static const void *
of_fwnode_device_get_match_data(const struct fwnode_handle *fwnode, of_fwnode_device_get_match_data(const struct fwnode_handle *fwnode,
const struct device *dev) const struct device *dev)
{ {
return (void *)of_device_get_match_data(dev); return of_device_get_match_data(dev);
} }
const struct fwnode_operations of_fwnode_ops = { const struct fwnode_operations of_fwnode_ops = {
......
...@@ -587,7 +587,7 @@ extern int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *), ...@@ -587,7 +587,7 @@ extern int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *),
const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids, const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,
const struct device *dev); const struct device *dev);
void *acpi_get_match_data(const struct device *dev); const void *acpi_device_get_match_data(const struct device *dev);
extern bool acpi_driver_match_device(struct device *dev, extern bool acpi_driver_match_device(struct device *dev,
const struct device_driver *drv); const struct device_driver *drv);
int acpi_device_uevent_modalias(struct device *, struct kobj_uevent_env *); int acpi_device_uevent_modalias(struct device *, struct kobj_uevent_env *);
...@@ -766,7 +766,7 @@ static inline const struct acpi_device_id *acpi_match_device( ...@@ -766,7 +766,7 @@ static inline const struct acpi_device_id *acpi_match_device(
return NULL; return NULL;
} }
static inline void *acpi_get_match_data(const struct device *dev) static inline const void *acpi_device_get_match_data(const struct device *dev)
{ {
return NULL; return NULL;
} }
......
...@@ -73,8 +73,8 @@ struct fwnode_operations { ...@@ -73,8 +73,8 @@ struct fwnode_operations {
struct fwnode_handle *(*get)(struct fwnode_handle *fwnode); struct fwnode_handle *(*get)(struct fwnode_handle *fwnode);
void (*put)(struct fwnode_handle *fwnode); void (*put)(struct fwnode_handle *fwnode);
bool (*device_is_available)(const struct fwnode_handle *fwnode); bool (*device_is_available)(const struct fwnode_handle *fwnode);
void *(*device_get_match_data)(const struct fwnode_handle *fwnode, const void *(*device_get_match_data)(const struct fwnode_handle *fwnode,
const struct device *dev); const struct device *dev);
bool (*property_present)(const struct fwnode_handle *fwnode, bool (*property_present)(const struct fwnode_handle *fwnode,
const char *propname); const char *propname);
int (*property_read_int_array)(const struct fwnode_handle *fwnode, int (*property_read_int_array)(const struct fwnode_handle *fwnode,
......
...@@ -283,7 +283,7 @@ bool device_dma_supported(struct device *dev); ...@@ -283,7 +283,7 @@ bool device_dma_supported(struct device *dev);
enum dev_dma_attr device_get_dma_attr(struct device *dev); enum dev_dma_attr device_get_dma_attr(struct device *dev);
void *device_get_match_data(struct device *dev); const void *device_get_match_data(struct device *dev);
int device_get_phy_mode(struct device *dev); int device_get_phy_mode(struct device *dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment