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

Commit faacd5ad authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

Merge branch 'acpi-scan' into acpi-cca

parents 0f57d867 0519ade7
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -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);


+31 −23
Original line number Original line Diff line number Diff line
@@ -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)
@@ -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)
+16 −14
Original line number Original line Diff line number Diff line
@@ -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)
@@ -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);
@@ -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)
@@ -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)
@@ -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;
	}
	}
@@ -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},
@@ -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, },
	{"", },
	{"", },
};
};


@@ -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);
+2 −1
Original line number Original line Diff line number Diff line
@@ -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 */