Loading drivers/acpi/internal.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -191,6 +191,8 @@ bool acpi_osi_is_win8(void); /*-------------------------------------------------------------------------- /*-------------------------------------------------------------------------- Device properties Device properties -------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */ #define ACPI_DT_NAMESPACE_HID "PRP0001" void acpi_init_properties(struct acpi_device *adev); void acpi_init_properties(struct acpi_device *adev); void acpi_free_properties(struct acpi_device *adev); void acpi_free_properties(struct acpi_device *adev); Loading drivers/acpi/property.c +31 −23 Original line number Original line Diff line number Diff line Loading @@ -79,50 +79,51 @@ static bool acpi_properties_format_valid(const union acpi_object *properties) static void acpi_init_of_compatible(struct acpi_device *adev) static void acpi_init_of_compatible(struct acpi_device *adev) { { const union acpi_object *of_compatible; const union acpi_object *of_compatible; struct acpi_hardware_id *hwid; bool acpi_of = false; int ret; int ret; /* * Check if the special PRP0001 ACPI ID is present and in that * case we fill in Device Tree compatible properties for this * device. */ list_for_each_entry(hwid, &adev->pnp.ids, list) { if (!strcmp(hwid->id, "PRP0001")) { acpi_of = true; break; } } if (!acpi_of) return; ret = acpi_dev_get_property_array(adev, "compatible", ACPI_TYPE_STRING, ret = acpi_dev_get_property_array(adev, "compatible", ACPI_TYPE_STRING, &of_compatible); &of_compatible); if (ret) { if (ret) { ret = acpi_dev_get_property(adev, "compatible", ret = acpi_dev_get_property(adev, "compatible", ACPI_TYPE_STRING, &of_compatible); ACPI_TYPE_STRING, &of_compatible); if (ret) { if (ret) { acpi_handle_warn(adev->handle, if (adev->parent "PRP0001 requires compatible property\n"); && adev->parent->flags.of_compatible_ok) goto out; return; return; } } } } adev->data.of_compatible = of_compatible; adev->data.of_compatible = of_compatible; out: adev->flags.of_compatible_ok = 1; } } void acpi_init_properties(struct acpi_device *adev) void acpi_init_properties(struct acpi_device *adev) { { struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER }; struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER }; bool acpi_of = false; struct acpi_hardware_id *hwid; const union acpi_object *desc; const union acpi_object *desc; acpi_status status; acpi_status status; int i; int i; /* * Check if ACPI_DT_NAMESPACE_HID is present and inthat case we fill in * Device Tree compatible properties for this device. */ list_for_each_entry(hwid, &adev->pnp.ids, list) { if (!strcmp(hwid->id, ACPI_DT_NAMESPACE_HID)) { acpi_of = true; break; } } status = acpi_evaluate_object_typed(adev->handle, "_DSD", NULL, &buf, status = acpi_evaluate_object_typed(adev->handle, "_DSD", NULL, &buf, ACPI_TYPE_PACKAGE); ACPI_TYPE_PACKAGE); if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status)) return; goto out; desc = buf.pointer; desc = buf.pointer; if (desc->package.count % 2) if (desc->package.count % 2) Loading Loading @@ -156,13 +157,20 @@ void acpi_init_properties(struct acpi_device *adev) adev->data.pointer = buf.pointer; adev->data.pointer = buf.pointer; adev->data.properties = properties; adev->data.properties = properties; if (acpi_of) acpi_init_of_compatible(adev); acpi_init_of_compatible(adev); return; goto out; } } fail: fail: dev_warn(&adev->dev, "Returned _DSD data is not valid, skipping\n"); dev_dbg(&adev->dev, "Returned _DSD data is not valid, skipping\n"); ACPI_FREE(buf.pointer); ACPI_FREE(buf.pointer); out: if (acpi_of && !adev->flags.of_compatible_ok) acpi_handle_info(adev->handle, ACPI_DT_NAMESPACE_HID " requires 'compatible' property\n"); } } void acpi_free_properties(struct acpi_device *adev) void acpi_free_properties(struct acpi_device *adev) Loading drivers/acpi/scan.c +16 −14 Original line number Original line Diff line number Diff line Loading @@ -135,12 +135,13 @@ static int create_pnp_modalias(struct acpi_device *acpi_dev, char *modalias, struct acpi_hardware_id *id; struct acpi_hardware_id *id; /* /* * Since we skip PRP0001 from the modalias below, 0 should be returned * Since we skip ACPI_DT_NAMESPACE_HID from the modalias below, 0 should * if PRP0001 is the only ACPI/PNP ID in the device's list. * be returned if ACPI_DT_NAMESPACE_HID is the only ACPI/PNP ID in the * device's list. */ */ count = 0; count = 0; list_for_each_entry(id, &acpi_dev->pnp.ids, list) list_for_each_entry(id, &acpi_dev->pnp.ids, list) if (strcmp(id->id, "PRP0001")) if (strcmp(id->id, ACPI_DT_NAMESPACE_HID)) count++; count++; if (!count) if (!count) Loading @@ -153,7 +154,7 @@ static int create_pnp_modalias(struct acpi_device *acpi_dev, char *modalias, size -= len; size -= len; list_for_each_entry(id, &acpi_dev->pnp.ids, list) { list_for_each_entry(id, &acpi_dev->pnp.ids, list) { if (!strcmp(id->id, "PRP0001")) if (!strcmp(id->id, ACPI_DT_NAMESPACE_HID)) continue; continue; count = snprintf(&modalias[len], size, "%s:", id->id); count = snprintf(&modalias[len], size, "%s:", id->id); Loading @@ -177,7 +178,8 @@ static int create_pnp_modalias(struct acpi_device *acpi_dev, char *modalias, * @size: Size of the buffer. * @size: Size of the buffer. * * * Expose DT compatible modalias as of:NnameTCcompatible. This function should * Expose DT compatible modalias as of:NnameTCcompatible. This function should * only be called for devices having PRP0001 in their list of ACPI/PNP IDs. * only be called for devices having ACPI_DT_NAMESPACE_HID in their list of * ACPI/PNP IDs. */ */ static int create_of_modalias(struct acpi_device *acpi_dev, char *modalias, static int create_of_modalias(struct acpi_device *acpi_dev, char *modalias, int size) int size) Loading Loading @@ -980,9 +982,9 @@ static void acpi_device_remove_files(struct acpi_device *dev) * @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. * * * If @dev has an ACPI companion which has the special PRP0001 device ID in its * If @dev has an ACPI companion which has ACPI_DT_NAMESPACE_HID in its list of * list of identifiers and a _DSD object with the "compatible" property, use * identifiers and a _DSD object with the "compatible" property, use that * 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) Loading Loading @@ -1038,14 +1040,14 @@ static const struct acpi_device_id *__acpi_match_device( return id; return id; /* /* * Next, check the special "PRP0001" ID 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 * The id returned by the below is not valid, but the only * caller passing non-NULL of_ids here is only interested in * caller passing non-NULL of_ids here is only interested in * whether or not the return value is NULL. * whether or not the return value is NULL. */ */ if (!strcmp("PRP0001", hwid->id) if (!strcmp(ACPI_DT_NAMESPACE_HID, hwid->id) && acpi_of_match_device(device, of_ids)) && acpi_of_match_device(device, of_ids)) return id; return id; } } Loading Loading @@ -1671,7 +1673,7 @@ static int acpi_bus_extract_wakeup_device_power_package(acpi_handle handle, static void acpi_wakeup_gpe_init(struct acpi_device *device) static void acpi_wakeup_gpe_init(struct acpi_device *device) { { struct acpi_device_id button_device_ids[] = { static const struct acpi_device_id button_device_ids[] = { {"PNP0C0C", 0}, {"PNP0C0C", 0}, {"PNP0C0D", 0}, {"PNP0C0D", 0}, {"PNP0C0E", 0}, {"PNP0C0E", 0}, Loading Loading @@ -2405,7 +2407,7 @@ static void acpi_default_enumeration(struct acpi_device *device) } } static const struct acpi_device_id generic_device_ids[] = { static const struct acpi_device_id generic_device_ids[] = { {"PRP0001", }, {ACPI_DT_NAMESPACE_HID, }, {"", }, {"", }, }; }; Loading @@ -2413,8 +2415,8 @@ static int acpi_generic_device_attach(struct acpi_device *adev, const struct acpi_device_id *not_used) const struct acpi_device_id *not_used) { { /* /* * Since PRP0001 is the only ID handled here, the test below can be * Since ACPI_DT_NAMESPACE_HID is the only ID handled here, the test * unconditional. * below can be unconditional. */ */ if (adev->data.of_compatible) if (adev->data.of_compatible) acpi_default_enumeration(adev); acpi_default_enumeration(adev); Loading include/acpi/acpi_bus.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -208,7 +208,8 @@ struct acpi_device_flags { u32 visited:1; u32 visited:1; u32 hotplug_notify:1; u32 hotplug_notify:1; u32 is_dock_station:1; u32 is_dock_station:1; u32 reserved:23; u32 of_compatible_ok:1; u32 reserved:22; }; }; /* File System */ /* File System */ Loading Loading
drivers/acpi/internal.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -191,6 +191,8 @@ bool acpi_osi_is_win8(void); /*-------------------------------------------------------------------------- /*-------------------------------------------------------------------------- Device properties Device properties -------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */ #define ACPI_DT_NAMESPACE_HID "PRP0001" void acpi_init_properties(struct acpi_device *adev); void acpi_init_properties(struct acpi_device *adev); void acpi_free_properties(struct acpi_device *adev); void acpi_free_properties(struct acpi_device *adev); Loading
drivers/acpi/property.c +31 −23 Original line number Original line Diff line number Diff line Loading @@ -79,50 +79,51 @@ static bool acpi_properties_format_valid(const union acpi_object *properties) static void acpi_init_of_compatible(struct acpi_device *adev) static void acpi_init_of_compatible(struct acpi_device *adev) { { const union acpi_object *of_compatible; const union acpi_object *of_compatible; struct acpi_hardware_id *hwid; bool acpi_of = false; int ret; int ret; /* * Check if the special PRP0001 ACPI ID is present and in that * case we fill in Device Tree compatible properties for this * device. */ list_for_each_entry(hwid, &adev->pnp.ids, list) { if (!strcmp(hwid->id, "PRP0001")) { acpi_of = true; break; } } if (!acpi_of) return; ret = acpi_dev_get_property_array(adev, "compatible", ACPI_TYPE_STRING, ret = acpi_dev_get_property_array(adev, "compatible", ACPI_TYPE_STRING, &of_compatible); &of_compatible); if (ret) { if (ret) { ret = acpi_dev_get_property(adev, "compatible", ret = acpi_dev_get_property(adev, "compatible", ACPI_TYPE_STRING, &of_compatible); ACPI_TYPE_STRING, &of_compatible); if (ret) { if (ret) { acpi_handle_warn(adev->handle, if (adev->parent "PRP0001 requires compatible property\n"); && adev->parent->flags.of_compatible_ok) goto out; return; return; } } } } adev->data.of_compatible = of_compatible; adev->data.of_compatible = of_compatible; out: adev->flags.of_compatible_ok = 1; } } void acpi_init_properties(struct acpi_device *adev) void acpi_init_properties(struct acpi_device *adev) { { struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER }; struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER }; bool acpi_of = false; struct acpi_hardware_id *hwid; const union acpi_object *desc; const union acpi_object *desc; acpi_status status; acpi_status status; int i; int i; /* * Check if ACPI_DT_NAMESPACE_HID is present and inthat case we fill in * Device Tree compatible properties for this device. */ list_for_each_entry(hwid, &adev->pnp.ids, list) { if (!strcmp(hwid->id, ACPI_DT_NAMESPACE_HID)) { acpi_of = true; break; } } status = acpi_evaluate_object_typed(adev->handle, "_DSD", NULL, &buf, status = acpi_evaluate_object_typed(adev->handle, "_DSD", NULL, &buf, ACPI_TYPE_PACKAGE); ACPI_TYPE_PACKAGE); if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status)) return; goto out; desc = buf.pointer; desc = buf.pointer; if (desc->package.count % 2) if (desc->package.count % 2) Loading Loading @@ -156,13 +157,20 @@ void acpi_init_properties(struct acpi_device *adev) adev->data.pointer = buf.pointer; adev->data.pointer = buf.pointer; adev->data.properties = properties; adev->data.properties = properties; if (acpi_of) acpi_init_of_compatible(adev); acpi_init_of_compatible(adev); return; goto out; } } fail: fail: dev_warn(&adev->dev, "Returned _DSD data is not valid, skipping\n"); dev_dbg(&adev->dev, "Returned _DSD data is not valid, skipping\n"); ACPI_FREE(buf.pointer); ACPI_FREE(buf.pointer); out: if (acpi_of && !adev->flags.of_compatible_ok) acpi_handle_info(adev->handle, ACPI_DT_NAMESPACE_HID " requires 'compatible' property\n"); } } void acpi_free_properties(struct acpi_device *adev) void acpi_free_properties(struct acpi_device *adev) Loading
drivers/acpi/scan.c +16 −14 Original line number Original line Diff line number Diff line Loading @@ -135,12 +135,13 @@ static int create_pnp_modalias(struct acpi_device *acpi_dev, char *modalias, struct acpi_hardware_id *id; struct acpi_hardware_id *id; /* /* * Since we skip PRP0001 from the modalias below, 0 should be returned * Since we skip ACPI_DT_NAMESPACE_HID from the modalias below, 0 should * if PRP0001 is the only ACPI/PNP ID in the device's list. * be returned if ACPI_DT_NAMESPACE_HID is the only ACPI/PNP ID in the * device's list. */ */ count = 0; count = 0; list_for_each_entry(id, &acpi_dev->pnp.ids, list) list_for_each_entry(id, &acpi_dev->pnp.ids, list) if (strcmp(id->id, "PRP0001")) if (strcmp(id->id, ACPI_DT_NAMESPACE_HID)) count++; count++; if (!count) if (!count) Loading @@ -153,7 +154,7 @@ static int create_pnp_modalias(struct acpi_device *acpi_dev, char *modalias, size -= len; size -= len; list_for_each_entry(id, &acpi_dev->pnp.ids, list) { list_for_each_entry(id, &acpi_dev->pnp.ids, list) { if (!strcmp(id->id, "PRP0001")) if (!strcmp(id->id, ACPI_DT_NAMESPACE_HID)) continue; continue; count = snprintf(&modalias[len], size, "%s:", id->id); count = snprintf(&modalias[len], size, "%s:", id->id); Loading @@ -177,7 +178,8 @@ static int create_pnp_modalias(struct acpi_device *acpi_dev, char *modalias, * @size: Size of the buffer. * @size: Size of the buffer. * * * Expose DT compatible modalias as of:NnameTCcompatible. This function should * Expose DT compatible modalias as of:NnameTCcompatible. This function should * only be called for devices having PRP0001 in their list of ACPI/PNP IDs. * only be called for devices having ACPI_DT_NAMESPACE_HID in their list of * ACPI/PNP IDs. */ */ static int create_of_modalias(struct acpi_device *acpi_dev, char *modalias, static int create_of_modalias(struct acpi_device *acpi_dev, char *modalias, int size) int size) Loading Loading @@ -980,9 +982,9 @@ static void acpi_device_remove_files(struct acpi_device *dev) * @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. * * * If @dev has an ACPI companion which has the special PRP0001 device ID in its * If @dev has an ACPI companion which has ACPI_DT_NAMESPACE_HID in its list of * list of identifiers and a _DSD object with the "compatible" property, use * identifiers and a _DSD object with the "compatible" property, use that * 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) Loading Loading @@ -1038,14 +1040,14 @@ static const struct acpi_device_id *__acpi_match_device( return id; return id; /* /* * Next, check the special "PRP0001" ID 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 * The id returned by the below is not valid, but the only * caller passing non-NULL of_ids here is only interested in * caller passing non-NULL of_ids here is only interested in * whether or not the return value is NULL. * whether or not the return value is NULL. */ */ if (!strcmp("PRP0001", hwid->id) if (!strcmp(ACPI_DT_NAMESPACE_HID, hwid->id) && acpi_of_match_device(device, of_ids)) && acpi_of_match_device(device, of_ids)) return id; return id; } } Loading Loading @@ -1671,7 +1673,7 @@ static int acpi_bus_extract_wakeup_device_power_package(acpi_handle handle, static void acpi_wakeup_gpe_init(struct acpi_device *device) static void acpi_wakeup_gpe_init(struct acpi_device *device) { { struct acpi_device_id button_device_ids[] = { static const struct acpi_device_id button_device_ids[] = { {"PNP0C0C", 0}, {"PNP0C0C", 0}, {"PNP0C0D", 0}, {"PNP0C0D", 0}, {"PNP0C0E", 0}, {"PNP0C0E", 0}, Loading Loading @@ -2405,7 +2407,7 @@ static void acpi_default_enumeration(struct acpi_device *device) } } static const struct acpi_device_id generic_device_ids[] = { static const struct acpi_device_id generic_device_ids[] = { {"PRP0001", }, {ACPI_DT_NAMESPACE_HID, }, {"", }, {"", }, }; }; Loading @@ -2413,8 +2415,8 @@ static int acpi_generic_device_attach(struct acpi_device *adev, const struct acpi_device_id *not_used) const struct acpi_device_id *not_used) { { /* /* * Since PRP0001 is the only ID handled here, the test below can be * Since ACPI_DT_NAMESPACE_HID is the only ID handled here, the test * unconditional. * below can be unconditional. */ */ if (adev->data.of_compatible) if (adev->data.of_compatible) acpi_default_enumeration(adev); acpi_default_enumeration(adev); Loading
include/acpi/acpi_bus.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -208,7 +208,8 @@ struct acpi_device_flags { u32 visited:1; u32 visited:1; u32 hotplug_notify:1; u32 hotplug_notify:1; u32 is_dock_station:1; u32 is_dock_station:1; u32 reserved:23; u32 of_compatible_ok:1; u32 reserved:22; }; }; /* File System */ /* File System */ Loading