hwmon: (asus_atk0110) Don't load if ACPI resources aren't enforced
authorJean Delvare <khali@linux-fr.org>
Thu, 27 May 2010 17:58:37 +0000 (19:58 +0200)
committerJean Delvare <khali@linux-fr.org>
Thu, 27 May 2010 17:58:37 +0000 (19:58 +0200)
When the user passes the kernel parameter acpi_enforce_resources=lax,
the ACPI resources are no longer protected, so a native driver can
make use of them. In that case, we do not want the asus_atk0110 to be
loaded. Unfortunately, this driver loads automatically due to its
MODULE_DEVICE_TABLE, so the user ends up with two drivers loaded for
the same device - this is bad.

So I suggest that we prevent the asus_atk0110 driver from loading if
acpi_enforce_resources=lax.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Acked-by: Luca Tettamanti <kronos.it@gmail.com>
Cc: Len Brown <lenb@kernel.org>
drivers/acpi/osl.c
drivers/hwmon/asus_atk0110.c
include/linux/acpi.h

index 4bc1c4178f506d3358d844f0ad15af2bf83d5bb7..78418ce4fc78a5cf99203e7890f81f36e23a10a8 100644 (file)
@@ -1206,6 +1206,15 @@ int acpi_check_mem_region(resource_size_t start, resource_size_t n,
 }
 EXPORT_SYMBOL(acpi_check_mem_region);
 
+/*
+ * Let drivers know whether the resource checks are effective
+ */
+int acpi_resources_are_enforced(void)
+{
+       return acpi_enforce_resources == ENFORCE_RESOURCES_STRICT;
+}
+EXPORT_SYMBOL(acpi_resources_are_enforced);
+
 /*
  * Acquire a spinlock.
  *
index 16c420240724ee72ac96933fc0953f9a12c5e9c0..653db1bda9348ebaa62d8f17f93c46a4b8cdadda 100644 (file)
@@ -1411,6 +1411,13 @@ static int __init atk0110_init(void)
 {
        int ret;
 
+       /* Make sure it's safe to access the device through ACPI */
+       if (!acpi_resources_are_enforced()) {
+               pr_err("atk: Resources not safely usable due to "
+                      "acpi_enforce_resources kernel parameter\n");
+               return -EBUSY;
+       }
+
        ret = acpi_bus_register_driver(&atk_driver);
        if (ret)
                pr_info("atk: acpi_bus_register_driver failed: %d\n", ret);
index 3da73f5f0ae997cb54e820cf8fbe3b73cffb5c06..2c60f1f70b38a4860a60e76348836f7661fa756e 100644 (file)
@@ -248,6 +248,8 @@ int acpi_check_region(resource_size_t start, resource_size_t n,
 int acpi_check_mem_region(resource_size_t start, resource_size_t n,
                      const char *name);
 
+int acpi_resources_are_enforced(void);
+
 #ifdef CONFIG_PM_SLEEP
 void __init acpi_no_s4_hw_signature(void);
 void __init acpi_old_suspend_ordering(void);