Commit d4e1a692 authored by Toshi Kani's avatar Toshi Kani Committed by Rafael J. Wysocki

ACPI: Remove acpi_device dependency in acpi_device_set_id()

This patch updates the internal operations of acpi_device_set_id()
to setup acpi_device_pnp without using acpi_device.  There is no
functional change to acpi_device_set_id() in this patch.

acpi_pnp_type is added to acpi_device_pnp, so that PNPID type is
self-contained within acpi_device_pnp.  acpi_add_id(), acpi_bay_match(),
acpi_dock_match(), acpi_ibm_smbus_match() and acpi_is_video_device()
are changed to take acpi_handle as an argument, instead of acpi_device.
Signed-off-by: default avatarToshi Kani <toshi.kani@hp.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent b09753ec
...@@ -526,7 +526,7 @@ static int acpi_device_setup_files(struct acpi_device *dev) ...@@ -526,7 +526,7 @@ static int acpi_device_setup_files(struct acpi_device *dev)
goto end; goto end;
} }
if (dev->flags.bus_address) if (dev->pnp.type.bus_address)
result = device_create_file(&dev->dev, &dev_attr_adr); result = device_create_file(&dev->dev, &dev_attr_adr);
if (dev->pnp.unique_id) if (dev->pnp.unique_id)
result = device_create_file(&dev->dev, &dev_attr_uid); result = device_create_file(&dev->dev, &dev_attr_uid);
...@@ -599,7 +599,7 @@ static void acpi_device_remove_files(struct acpi_device *dev) ...@@ -599,7 +599,7 @@ static void acpi_device_remove_files(struct acpi_device *dev)
if (dev->pnp.unique_id) if (dev->pnp.unique_id)
device_remove_file(&dev->dev, &dev_attr_uid); device_remove_file(&dev->dev, &dev_attr_uid);
if (dev->flags.bus_address) if (dev->pnp.type.bus_address)
device_remove_file(&dev->dev, &dev_attr_adr); device_remove_file(&dev->dev, &dev_attr_adr);
device_remove_file(&dev->dev, &dev_attr_modalias); device_remove_file(&dev->dev, &dev_attr_modalias);
device_remove_file(&dev->dev, &dev_attr_hid); device_remove_file(&dev->dev, &dev_attr_hid);
...@@ -1406,19 +1406,17 @@ static void acpi_device_get_busid(struct acpi_device *device) ...@@ -1406,19 +1406,17 @@ static void acpi_device_get_busid(struct acpi_device *device)
} }
/* /*
* acpi_bay_match - see if a device is an ejectable driver bay * acpi_bay_match - see if an acpi object is an ejectable driver bay
* *
* If an acpi object is ejectable and has one of the ACPI ATA methods defined, * If an acpi object is ejectable and has one of the ACPI ATA methods defined,
* then we can safely call it an ejectable drive bay * then we can safely call it an ejectable drive bay
*/ */
static int acpi_bay_match(struct acpi_device *device){ static int acpi_bay_match(acpi_handle handle)
{
acpi_status status; acpi_status status;
acpi_handle handle;
acpi_handle tmp; acpi_handle tmp;
acpi_handle phandle; acpi_handle phandle;
handle = device->handle;
status = acpi_get_handle(handle, "_EJ0", &tmp); status = acpi_get_handle(handle, "_EJ0", &tmp);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
return -ENODEV; return -ENODEV;
...@@ -1442,12 +1440,12 @@ static int acpi_bay_match(struct acpi_device *device){ ...@@ -1442,12 +1440,12 @@ static int acpi_bay_match(struct acpi_device *device){
} }
/* /*
* acpi_dock_match - see if a device has a _DCK method * acpi_dock_match - see if an acpi object has a _DCK method
*/ */
static int acpi_dock_match(struct acpi_device *device) static int acpi_dock_match(acpi_handle handle)
{ {
acpi_handle tmp; acpi_handle tmp;
return acpi_get_handle(device->handle, "_DCK", &tmp); return acpi_get_handle(handle, "_DCK", &tmp);
} }
const char *acpi_device_hid(struct acpi_device *device) const char *acpi_device_hid(struct acpi_device *device)
...@@ -1462,7 +1460,7 @@ const char *acpi_device_hid(struct acpi_device *device) ...@@ -1462,7 +1460,7 @@ const char *acpi_device_hid(struct acpi_device *device)
} }
EXPORT_SYMBOL(acpi_device_hid); EXPORT_SYMBOL(acpi_device_hid);
static void acpi_add_id(struct acpi_device *device, const char *dev_id) static void acpi_add_id(struct acpi_device_pnp *pnp, const char *dev_id)
{ {
struct acpi_hardware_id *id; struct acpi_hardware_id *id;
...@@ -1476,7 +1474,8 @@ static void acpi_add_id(struct acpi_device *device, const char *dev_id) ...@@ -1476,7 +1474,8 @@ static void acpi_add_id(struct acpi_device *device, const char *dev_id)
return; return;
} }
list_add_tail(&id->list, &device->pnp.ids); list_add_tail(&id->list, &pnp->ids);
pnp->type.hardware_id = 1;
} }
/* /*
...@@ -1484,7 +1483,7 @@ static void acpi_add_id(struct acpi_device *device, const char *dev_id) ...@@ -1484,7 +1483,7 @@ static void acpi_add_id(struct acpi_device *device, const char *dev_id)
* lacks the SMBUS01 HID and the methods do not have the necessary "_" * lacks the SMBUS01 HID and the methods do not have the necessary "_"
* prefix. Work around this. * prefix. Work around this.
*/ */
static int acpi_ibm_smbus_match(struct acpi_device *device) static int acpi_ibm_smbus_match(acpi_handle handle)
{ {
acpi_handle h_dummy; acpi_handle h_dummy;
struct acpi_buffer path = {ACPI_ALLOCATE_BUFFER, NULL}; struct acpi_buffer path = {ACPI_ALLOCATE_BUFFER, NULL};
...@@ -1494,7 +1493,7 @@ static int acpi_ibm_smbus_match(struct acpi_device *device) ...@@ -1494,7 +1493,7 @@ static int acpi_ibm_smbus_match(struct acpi_device *device)
return -ENODEV; return -ENODEV;
/* Look for SMBS object */ /* Look for SMBS object */
result = acpi_get_name(device->handle, ACPI_SINGLE_NAME, &path); result = acpi_get_name(handle, ACPI_SINGLE_NAME, &path);
if (result) if (result)
return result; return result;
...@@ -1505,9 +1504,9 @@ static int acpi_ibm_smbus_match(struct acpi_device *device) ...@@ -1505,9 +1504,9 @@ static int acpi_ibm_smbus_match(struct acpi_device *device)
/* Does it have the necessary (but misnamed) methods? */ /* Does it have the necessary (but misnamed) methods? */
result = -ENODEV; result = -ENODEV;
if (ACPI_SUCCESS(acpi_get_handle(device->handle, "SBI", &h_dummy)) && if (ACPI_SUCCESS(acpi_get_handle(handle, "SBI", &h_dummy)) &&
ACPI_SUCCESS(acpi_get_handle(device->handle, "SBR", &h_dummy)) && ACPI_SUCCESS(acpi_get_handle(handle, "SBR", &h_dummy)) &&
ACPI_SUCCESS(acpi_get_handle(device->handle, "SBW", &h_dummy))) ACPI_SUCCESS(acpi_get_handle(handle, "SBW", &h_dummy)))
result = 0; result = 0;
out: out:
kfree(path.pointer); kfree(path.pointer);
...@@ -1524,7 +1523,7 @@ static void acpi_device_set_id(struct acpi_device *device) ...@@ -1524,7 +1523,7 @@ static void acpi_device_set_id(struct acpi_device *device)
switch (device->device_type) { switch (device->device_type) {
case ACPI_BUS_TYPE_DEVICE: case ACPI_BUS_TYPE_DEVICE:
if (ACPI_IS_ROOT_DEVICE(device)) { if (ACPI_IS_ROOT_DEVICE(device)) {
acpi_add_id(device, ACPI_SYSTEM_HID); acpi_add_id(&device->pnp, ACPI_SYSTEM_HID);
break; break;
} }
...@@ -1535,15 +1534,15 @@ static void acpi_device_set_id(struct acpi_device *device) ...@@ -1535,15 +1534,15 @@ static void acpi_device_set_id(struct acpi_device *device)
} }
if (info->valid & ACPI_VALID_HID) if (info->valid & ACPI_VALID_HID)
acpi_add_id(device, info->hardware_id.string); acpi_add_id(&device->pnp, info->hardware_id.string);
if (info->valid & ACPI_VALID_CID) { if (info->valid & ACPI_VALID_CID) {
cid_list = &info->compatible_id_list; cid_list = &info->compatible_id_list;
for (i = 0; i < cid_list->count; i++) for (i = 0; i < cid_list->count; i++)
acpi_add_id(device, cid_list->ids[i].string); acpi_add_id(&device->pnp, cid_list->ids[i].string);
} }
if (info->valid & ACPI_VALID_ADR) { if (info->valid & ACPI_VALID_ADR) {
device->pnp.bus_address = info->address; device->pnp.bus_address = info->address;
device->flags.bus_address = 1; device->pnp.type.bus_address = 1;
} }
if (info->valid & ACPI_VALID_UID) if (info->valid & ACPI_VALID_UID)
device->pnp.unique_id = kstrdup(info->unique_id.string, device->pnp.unique_id = kstrdup(info->unique_id.string,
...@@ -1555,36 +1554,36 @@ static void acpi_device_set_id(struct acpi_device *device) ...@@ -1555,36 +1554,36 @@ static void acpi_device_set_id(struct acpi_device *device)
* Some devices don't reliably have _HIDs & _CIDs, so add * Some devices don't reliably have _HIDs & _CIDs, so add
* synthetic HIDs to make sure drivers can find them. * synthetic HIDs to make sure drivers can find them.
*/ */
if (acpi_is_video_device(device)) if (acpi_is_video_device(device->handle))
acpi_add_id(device, ACPI_VIDEO_HID); acpi_add_id(&device->pnp, ACPI_VIDEO_HID);
else if (ACPI_SUCCESS(acpi_bay_match(device))) else if (ACPI_SUCCESS(acpi_bay_match(device->handle)))
acpi_add_id(device, ACPI_BAY_HID); acpi_add_id(&device->pnp, ACPI_BAY_HID);
else if (ACPI_SUCCESS(acpi_dock_match(device))) else if (ACPI_SUCCESS(acpi_dock_match(device->handle)))
acpi_add_id(device, ACPI_DOCK_HID); acpi_add_id(&device->pnp, ACPI_DOCK_HID);
else if (!acpi_ibm_smbus_match(device)) else if (!acpi_ibm_smbus_match(device->handle))
acpi_add_id(device, ACPI_SMBUS_IBM_HID); acpi_add_id(&device->pnp, ACPI_SMBUS_IBM_HID);
else if (list_empty(&device->pnp.ids) && else if (list_empty(&device->pnp.ids) &&
ACPI_IS_ROOT_DEVICE(device->parent)) { ACPI_IS_ROOT_DEVICE(device->parent)) {
acpi_add_id(device, ACPI_BUS_HID); /* \_SB, LNXSYBUS */ acpi_add_id(&device->pnp, ACPI_BUS_HID); /* \_SB, LNXSYBUS */
strcpy(device->pnp.device_name, ACPI_BUS_DEVICE_NAME); strcpy(device->pnp.device_name, ACPI_BUS_DEVICE_NAME);
strcpy(device->pnp.device_class, ACPI_BUS_CLASS); strcpy(device->pnp.device_class, ACPI_BUS_CLASS);
} }
break; break;
case ACPI_BUS_TYPE_POWER: case ACPI_BUS_TYPE_POWER:
acpi_add_id(device, ACPI_POWER_HID); acpi_add_id(&device->pnp, ACPI_POWER_HID);
break; break;
case ACPI_BUS_TYPE_PROCESSOR: case ACPI_BUS_TYPE_PROCESSOR:
acpi_add_id(device, ACPI_PROCESSOR_OBJECT_HID); acpi_add_id(&device->pnp, ACPI_PROCESSOR_OBJECT_HID);
break; break;
case ACPI_BUS_TYPE_THERMAL: case ACPI_BUS_TYPE_THERMAL:
acpi_add_id(device, ACPI_THERMAL_HID); acpi_add_id(&device->pnp, ACPI_THERMAL_HID);
break; break;
case ACPI_BUS_TYPE_POWER_BUTTON: case ACPI_BUS_TYPE_POWER_BUTTON:
acpi_add_id(device, ACPI_BUTTON_HID_POWERF); acpi_add_id(&device->pnp, ACPI_BUTTON_HID_POWERF);
break; break;
case ACPI_BUS_TYPE_SLEEP_BUTTON: case ACPI_BUS_TYPE_SLEEP_BUTTON:
acpi_add_id(device, ACPI_BUTTON_HID_SLEEPF); acpi_add_id(&device->pnp, ACPI_BUTTON_HID_SLEEPF);
break; break;
} }
} }
......
...@@ -67,40 +67,37 @@ acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context, ...@@ -67,40 +67,37 @@ acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context,
return 0; return 0;
} }
/* Returns true if the device is a video device which can be handled by /* Returns true if the ACPI object is a video device which can be
* video.ko. * handled by video.ko.
* The device will get a Linux specific CID added in scan.c to * The device will get a Linux specific CID added in scan.c to
* identify the device as an ACPI graphics device * identify the device as an ACPI graphics device
* Be aware that the graphics device may not be physically present * Be aware that the graphics device may not be physically present
* Use acpi_video_get_capabilities() to detect general ACPI video * Use acpi_video_get_capabilities() to detect general ACPI video
* capabilities of present cards * capabilities of present cards
*/ */
long acpi_is_video_device(struct acpi_device *device) long acpi_is_video_device(acpi_handle handle)
{ {
acpi_handle h_dummy; acpi_handle h_dummy;
long video_caps = 0; long video_caps = 0;
if (!device)
return 0;
/* Is this device able to support video switching ? */ /* Is this device able to support video switching ? */
if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOD", &h_dummy)) || if (ACPI_SUCCESS(acpi_get_handle(handle, "_DOD", &h_dummy)) ||
ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOS", &h_dummy))) ACPI_SUCCESS(acpi_get_handle(handle, "_DOS", &h_dummy)))
video_caps |= ACPI_VIDEO_OUTPUT_SWITCHING; video_caps |= ACPI_VIDEO_OUTPUT_SWITCHING;
/* Is this device able to retrieve a video ROM ? */ /* Is this device able to retrieve a video ROM ? */
if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_ROM", &h_dummy))) if (ACPI_SUCCESS(acpi_get_handle(handle, "_ROM", &h_dummy)))
video_caps |= ACPI_VIDEO_ROM_AVAILABLE; video_caps |= ACPI_VIDEO_ROM_AVAILABLE;
/* Is this device able to configure which video head to be POSTed ? */ /* Is this device able to configure which video head to be POSTed ? */
if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_VPO", &h_dummy)) && if (ACPI_SUCCESS(acpi_get_handle(handle, "_VPO", &h_dummy)) &&
ACPI_SUCCESS(acpi_get_handle(device->handle, "_GPD", &h_dummy)) && ACPI_SUCCESS(acpi_get_handle(handle, "_GPD", &h_dummy)) &&
ACPI_SUCCESS(acpi_get_handle(device->handle, "_SPD", &h_dummy))) ACPI_SUCCESS(acpi_get_handle(handle, "_SPD", &h_dummy)))
video_caps |= ACPI_VIDEO_DEVICE_POSTING; video_caps |= ACPI_VIDEO_DEVICE_POSTING;
/* Only check for backlight functionality if one of the above hit. */ /* Only check for backlight functionality if one of the above hit. */
if (video_caps) if (video_caps)
acpi_walk_namespace(ACPI_TYPE_DEVICE, device->handle, acpi_walk_namespace(ACPI_TYPE_DEVICE, handle,
ACPI_UINT32_MAX, acpi_backlight_cap_match, NULL, ACPI_UINT32_MAX, acpi_backlight_cap_match, NULL,
&video_caps, NULL); &video_caps, NULL);
...@@ -127,7 +124,7 @@ find_video(acpi_handle handle, u32 lvl, void *context, void **rv) ...@@ -127,7 +124,7 @@ find_video(acpi_handle handle, u32 lvl, void *context, void **rv)
if (!dev) if (!dev)
return AE_OK; return AE_OK;
pci_dev_put(dev); pci_dev_put(dev);
*cap |= acpi_is_video_device(acpi_dev); *cap |= acpi_is_video_device(handle);
} }
return AE_OK; return AE_OK;
} }
......
...@@ -350,11 +350,11 @@ static void intel_didl_outputs(struct drm_device *dev) ...@@ -350,11 +350,11 @@ static void intel_didl_outputs(struct drm_device *dev)
if (!handle || acpi_bus_get_device(handle, &acpi_dev)) if (!handle || acpi_bus_get_device(handle, &acpi_dev))
return; return;
if (acpi_is_video_device(acpi_dev)) if (acpi_is_video_device(handle))
acpi_video_bus = acpi_dev; acpi_video_bus = acpi_dev;
else { else {
list_for_each_entry(acpi_cdev, &acpi_dev->children, node) { list_for_each_entry(acpi_cdev, &acpi_dev->children, node) {
if (acpi_is_video_device(acpi_cdev)) { if (acpi_is_video_device(acpi_cdev->handle)) {
acpi_video_bus = acpi_cdev; acpi_video_bus = acpi_cdev;
break; break;
} }
......
...@@ -161,7 +161,6 @@ struct acpi_device_status { ...@@ -161,7 +161,6 @@ struct acpi_device_status {
struct acpi_device_flags { struct acpi_device_flags {
u32 dynamic_status:1; u32 dynamic_status:1;
u32 bus_address:1;
u32 removable:1; u32 removable:1;
u32 ejectable:1; u32 ejectable:1;
u32 suprise_removal_ok:1; u32 suprise_removal_ok:1;
...@@ -169,7 +168,7 @@ struct acpi_device_flags { ...@@ -169,7 +168,7 @@ struct acpi_device_flags {
u32 performance_manageable:1; u32 performance_manageable:1;
u32 eject_pending:1; u32 eject_pending:1;
u32 match_driver:1; u32 match_driver:1;
u32 reserved:23; u32 reserved:24;
}; };
/* File System */ /* File System */
...@@ -192,10 +191,17 @@ struct acpi_hardware_id { ...@@ -192,10 +191,17 @@ struct acpi_hardware_id {
char *id; char *id;
}; };
struct acpi_pnp_type {
u32 hardware_id:1;
u32 bus_address:1;
u32 reserved:30;
};
struct acpi_device_pnp { struct acpi_device_pnp {
acpi_bus_id bus_id; /* Object name */ acpi_bus_id bus_id; /* Object name */
struct acpi_pnp_type type; /* ID type */
acpi_bus_address bus_address; /* _ADR */ acpi_bus_address bus_address; /* _ADR */
char *unique_id; /* _UID */ char *unique_id; /* _UID */
struct list_head ids; /* _HID and _CIDs */ struct list_head ids; /* _HID and _CIDs */
acpi_device_name device_name; /* Driver-determined */ acpi_device_name device_name; /* Driver-determined */
acpi_device_class device_class; /* " */ acpi_device_class device_class; /* " */
......
...@@ -204,7 +204,7 @@ extern bool wmi_has_guid(const char *guid); ...@@ -204,7 +204,7 @@ extern bool wmi_has_guid(const char *guid);
#if defined(CONFIG_ACPI_VIDEO) || defined(CONFIG_ACPI_VIDEO_MODULE) #if defined(CONFIG_ACPI_VIDEO) || defined(CONFIG_ACPI_VIDEO_MODULE)
extern long acpi_video_get_capabilities(acpi_handle graphics_dev_handle); extern long acpi_video_get_capabilities(acpi_handle graphics_dev_handle);
extern long acpi_is_video_device(struct acpi_device *device); extern long acpi_is_video_device(acpi_handle handle);
extern void acpi_video_dmi_promote_vendor(void); extern void acpi_video_dmi_promote_vendor(void);
extern void acpi_video_dmi_demote_vendor(void); extern void acpi_video_dmi_demote_vendor(void);
extern int acpi_video_backlight_support(void); extern int acpi_video_backlight_support(void);
...@@ -217,7 +217,7 @@ static inline long acpi_video_get_capabilities(acpi_handle graphics_dev_handle) ...@@ -217,7 +217,7 @@ static inline long acpi_video_get_capabilities(acpi_handle graphics_dev_handle)
return 0; return 0;
} }
static inline long acpi_is_video_device(struct acpi_device *device) static inline long acpi_is_video_device(acpi_handle handle)
{ {
return 0; return 0;
} }
......
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