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

Commit 2b2ae7c7 authored by Thomas Renninger's avatar Thomas Renninger Committed by Len Brown
Browse files

ACPI: Do not export hid/modalias sysfs file for ACPI objects without a HID

Boot and compile tested.
The fact that pnp.ids can now be empty needs testing on some
further machines, though.

This should handle a "modprobe is wrongly called by udev" issue:
https://bugzilla.kernel.org/show_bug.cgi?id=19162



Modaliase files in
/sys/devices/LNXSYSTM:00/
went down from 113 to 71 on my tested system.

This is a sysfs change, but userspace must already be able to handle it.

Also do not fill up pnp.ids list with a "struct hid"
entry. This comment:
     * This generic ID isn't useful for driver binding, but it provides
     * the useful property that "every acpi_device has an ID."
is still half way true:
Best you never touch pnp.ids list directly or make sure it can be empty,
instead use:
char *acpi_device_hid()
which always returns a value ("device" as a dummy if the object
has no hid).

Signed-off-by: default avatarThomas Renninger <trenn@suse.de>
CC: Zhang Rui <rui.zhang@intel.com>
CC: kay.sievers@vrfy.org
CC: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 899611ee
Loading
Loading
Loading
Loading
+20 −16
Original line number Diff line number Diff line
@@ -26,6 +26,9 @@ extern struct acpi_device *acpi_root;

#define ACPI_IS_ROOT_DEVICE(device)    (!(device)->parent)

/* Should be const */
static char* dummy_hid = "device";

static LIST_HEAD(acpi_device_list);
static LIST_HEAD(acpi_bus_id_list);
DEFINE_MUTEX(acpi_device_lock);
@@ -49,6 +52,9 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias,
	int count;
	struct acpi_hardware_id *id;

	if (list_empty(&acpi_dev->pnp.ids))
		return 0;

	len = snprintf(modalias, size, "acpi:");
	size -= len;

@@ -202,6 +208,7 @@ static int acpi_device_setup_files(struct acpi_device *dev)
			goto end;
	}

	if (!list_empty(&dev->pnp.ids)) {
		result = device_create_file(&dev->dev, &dev_attr_hid);
		if (result)
			goto end;
@@ -209,6 +216,7 @@ static int acpi_device_setup_files(struct acpi_device *dev)
		result = device_create_file(&dev->dev, &dev_attr_modalias);
		if (result)
			goto end;
	}

        /*
         * If device has _EJ0, 'eject' file is created that is used to trigger
@@ -316,6 +324,9 @@ static int acpi_device_uevent(struct device *dev, struct kobj_uevent_env *env)
	struct acpi_device *acpi_dev = to_acpi_device(dev);
	int len;

	if (list_empty(&acpi_dev->pnp.ids))
		return 0;

	if (add_uevent_var(env, "MODALIAS="))
		return -ENOMEM;
	len = create_modalias(acpi_dev, &env->buf[env->buflen - 1],
@@ -1014,6 +1025,9 @@ char *acpi_device_hid(struct acpi_device *device)
{
	struct acpi_hardware_id *hid;

	if (list_empty(&device->pnp.ids))
		return dummy_hid;

	hid = list_first_entry(&device->pnp.ids, struct acpi_hardware_id, list);
	return hid->id;
}
@@ -1142,16 +1156,6 @@ static void acpi_device_set_id(struct acpi_device *device)
		acpi_add_id(device, ACPI_BUTTON_HID_SLEEPF);
		break;
	}

	/*
	 * We build acpi_devices for some objects that don't have _HID or _CID,
	 * e.g., PCI bridges and slots.  Drivers can't bind to these objects,
	 * but we do use them indirectly by traversing the acpi_device tree.
	 * This generic ID isn't useful for driver binding, but it provides
	 * the useful property that "every acpi_device has an ID."
	 */
	if (list_empty(&device->pnp.ids))
		acpi_add_id(device, "device");
}

static int acpi_device_set_context(struct acpi_device *device)