ACPI updates for v4.16-rc2
- 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). -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJahfZtAAoJEILEb/54YlRxi38P/i+I+LcWj06h4aj2xXqoqyqk No7/BZrcQyg4Y8goRagsYwbxkC1WqcrlDcjNkaHV+tTjR77pAJlFsNhYNG4lo4ch hlA3ickDXhC71Sm/vUQ1SpOKRUAOojFyWkBf82JSqTiOkjJ3NpNy0z//JX6lM1II YwK45QK2GGQt6USJvU6pfBEBdDETfYq4l4xV7FhfpTrcqs3SFOHNBlbUYjtwoZ9l RCVvdUjAmYd3LTMyuLuQnj0g+oCul230CmAb2xd5E82jep+Wdne/oXmNMeJw/6vm hb2SAdHvJqAIm/yV25fKYt+/h8rjoUVdILoDtmjByvc3h5No6OvjhxL4zu4kg9O4 EEVEnKGs55syk+fHpyhfawxdj/qe1XQHw2QUKh/gCbE/ObOnx+WC9Ot1gB+6Sw0w 08CFzb5PJ74Atf/6ceFotSksWZzOsEM/QixqKVZ4u0QUiG42rO7rYTa8TVHxwGVv LOdIpShWbOzXaqBH+Se/9loKJVG+UnCWyfRlU+W1JjZs+I1c0PDgbIGyaOmgZXjk n5FxQ/dCudKWfZwU/z9dWya5O58aQM/aWP6KweuLtv2ZQ03aKNpen+HJC7MN3Xh2 0x7RPCTmK9QROsXDOOeKckiCLSGiuSQZ2VMReY5C6EtlCX5GiD9jAG9IQiLDGVfb 93VxegPRbEyY5HQe6Udy =gdK1 -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
b63b1e5730
|
@ -0,0 +1,39 @@
|
||||||
|
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.
|
|
@ -0,0 +1,40 @@
|
||||||
|
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)
|
||||||
* 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,
|
||||||
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,
|
||||||
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(
|
||||||
* 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(
|
||||||
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,
|
||||||
{
|
{
|
||||||
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)
|
||||||
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)
|
||||||
{
|
{
|
||||||
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,
|
||||||
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)
|
||||||
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,
|
||||||
}
|
}
|
||||||
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,
|
||||||
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 *),
|
||||||
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(
|
||||||
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 {
|
||||||
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);
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue